none
CStringAからCStringに変換する方法およびその逆のCStringからCStringAに変換する方法

    質問

  • VisuarStudio2010 C++MFCで.Net2003のプログラムを2010に移植するプログラミングしているのですが

    大半の部分はCStringをCStringAに変更すればOKだったのですが、

    ダイアログの変数にはCStringAは定義できないようなのでCStringAからCStringに変換する必要がでてきました。

    いろいろやってみたのですがFormatの関数で変換できないかやってみたところエラーにはならないのですが、文字が化けてしまいました、何か簡単な方法がないか探しています。

    サンプルは以下のようにテストしました

    CStringAからCStringに変換し一度化けたstr1を再びCStringAにもどして見ると正しく表示するのですが(strA2)

     {//テスト
      CStringA strA,strA1,strA2;
      CString str,str1,str2;

      strA="123井上";
      str="ファイル";

      str1.Format(_T("%s"),strA);//化ける
      strA1.Format("%s",str);//化ける

      strA2.Format("%s",str1);//123井上
      str2.Format(_T("%s"),str);//ファイル

     }

    2012年10月21日 6:49

回答

  • まずCStringTのドキュメントを読みましょう。char*(ANSI文字列) / wchar_T*(Unicode文字列)どちらも受け入れるようにコンストラクターが定義されています。

    CStringT( const XCHAR* pszSrc ) : CThisSimpleString( StringTraits::GetDefaultManager() );
    
    CSTRING_EXPLICIT CStringT( const YCHAR* pszSrc ) : CThisSimpleString( StringTraits::GetDefaultManager() );
    

    つまりC言語の古いバージョンのように変数を先頭に宣言するのではなくC++言語らしくRAIIに沿って変数を使うときに宣言すれば

    {//テスト
      CStringA strA( "123井上" );
      CString str( _T("ファイル") );
    
      CString str1( strA );
      CStringA strA1( str );
    
      // どうしてもというなら代入でもよい
      CStringA strA2 = CStringA( str1 );
      CString str2 = CString( str );
    }

    となります。というかそもそもテストコードにある str = "ファイル"; というコード自体、右辺値はchar*(ANSI文字列)であり、それをCString(TCHARバージョン)に変換しています。

    2012年10月21日 7:27

すべての返信

  • まずCStringTのドキュメントを読みましょう。char*(ANSI文字列) / wchar_T*(Unicode文字列)どちらも受け入れるようにコンストラクターが定義されています。

    CStringT( const XCHAR* pszSrc ) : CThisSimpleString( StringTraits::GetDefaultManager() );
    
    CSTRING_EXPLICIT CStringT( const YCHAR* pszSrc ) : CThisSimpleString( StringTraits::GetDefaultManager() );
    

    つまりC言語の古いバージョンのように変数を先頭に宣言するのではなくC++言語らしくRAIIに沿って変数を使うときに宣言すれば

    {//テスト
      CStringA strA( "123井上" );
      CString str( _T("ファイル") );
    
      CString str1( strA );
      CStringA strA1( str );
    
      // どうしてもというなら代入でもよい
      CStringA strA2 = CStringA( str1 );
      CString str2 = CString( str );
    }

    となります。というかそもそもテストコードにある str = "ファイル"; というコード自体、右辺値はchar*(ANSI文字列)であり、それをCString(TCHARバージョン)に変換しています。

    2012年10月21日 7:27
  • うまくいきました

    その様な方法があったのですね

    何度も回答をいただき本当にありがとうございました

    重ね重ねお礼を申し上げます。

    2012年10月21日 9:13