2012-02-13 21 views
1

私はマルチバイト文字セットでコンパイルされたプロジェクトを持っています。 msg1に日本語の文字が含まれていると、以下の変換が失敗します。日本語システムの文字変換が正しくありません

bool MyClass::UnfoldEnvelope(BSTR msg1) 
{ 
    CW2A msg(msg1); 
    LPCTSTR p0 = msg; 
    .... 
} 

入力時に、msg1はユニコード文字を含み、パス名が日本語のBSTRです。変換CW2Aは、呼び出しの後にmsgが文字列を日本語で認識可能に含むという点で機能しているようです。ただし、LPCTSTRの割り当ては失敗します。行の後、p0にはゴミが含まれています。文字列p0は、古いコードで続いて使用されます。私は触れるのを嫌っています。

この場合、文字列 "msg"へのポインタを取得する正しい方法は何ですか?

英語ではすべて正常に動作します。

+0

あなたは' p0'にアクセスしていますか? 'msg'がスコープから外れると、' p0'は無効になります。破壊されたオブジェクトへのポインタです。 'msg'が破棄された後に文字列にアクセスする必要がある場合は、文字列を別のものにコピーする必要があります。 – bames53

+0

@ bames53はい、細かい点がありますが、p0はこの機能の中で排他的に使用されています - msgは有効範囲内にあります –

答えて

0

WideCharToMultiByteを試してみてください! CP_ACPはワイド文字列を現在のWindows言語の1バイト文字列に変換します(日本語のWindowsでは日本語でもよい、CW2Aも同様です)。あなたのWindowsが日本語ではなく、日本語の文字を持っている場合は、CP_UTF8(UTF-8)を使用して、それを使用(表示、印刷、またはファイル名として使用)したときにテキストをUTF-16(wchar_t)に戻す必要があります。変換するには、MultiByteToWideChar機能を使用する必要があります。

ANSIマルチバイトコードは、Unicode全体の一部に過ぎません。 Windowsでは、Windowsの場所と同じサブセットを使用します(Control Panelで設定できます)。あなたが本当のUnicode文字列を持っているか、あなたのロケールベースの文字列を持っていない場合、すべての文字をUnicodeに保つ必要があります。シングルバイト文字列とUnicodeを扱う場合は、wchar_t文字列(すべてのWindowsワイド文字はUTF-16)をUTF-8 Unicode文字列に転送する必要があります。

チェックこのソース: `msg`がスコープ内にある間

bool MyClass::UnfoldEnvelope(BSTR msg1) 
{ 
    // Get the necessary space for single byte string 
    int new_size = WideCharToMultiByte(CP_UTF8, 0, msg1, -1, NULL, NULL, NULL, NULL); 
    if (new_size <= 0) 
     return false; 
    // Use vector to C functions 
    vector<char> p0(new_size); 
    // Convert the string 
    if (WideCharToMultiByte(CP_UTF8, 0, msg1, -1, &p0[0], new_size, NULL, NULL) <= 0) 
    { 
     return false; 
    } 
    // use string as a usual single byte string (save, load etc.) 
    .... 
    // get the string size in UTF-16 
    new_size = MultiByteToWideChar(CP_UTF8, 0, &p0[0], -1, NULL, NULL); 
    if (new_size <= 0) 
     return false; 
    // Use vector to C functions 
    vector<wchar_t> p1w(new_size); 
    // convert back to UTF-16 
    if (MultiByteToWideChar(CP_UTF8, 0, &p0[0], -1, &p1w[0], new_size) <= 0) 
     return false; 
    ... 
    // use your Unicode string as a file name 
    return (CopyFileW(L"old_file", &p1w[0], TRUE) != FALSE); 
} 
+0

あなたの最も参考になった説明をありがとうございます - –

+0

@AndrewS:ちょっとしたこと:ワイド文字列をマルチバイト文字列に変換しないでください。 Windows APIのワイド関数では、単にワイド文字列を使用できます。 :) – Naszta

関連する問題