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);
}
あなたは' p0'にアクセスしていますか? 'msg'がスコープから外れると、' p0'は無効になります。破壊されたオブジェクトへのポインタです。 'msg'が破棄された後に文字列にアクセスする必要がある場合は、文字列を別のものにコピーする必要があります。 – bames53
@ bames53はい、細かい点がありますが、p0はこの機能の中で排他的に使用されています - msgは有効範囲内にあります –