Попробуйте использовать WideCharToMultiByte
! CP_ACP переводит строку широких символов в текущую однобайтовую строку языка Windows (это может быть японский язык в японской Windows, CW2A делает то же самое). Если ваша Windows не японская, но у вас есть японские символы, вы должны использовать CP_UTF8 (UTF-8) и перенести текст обратно в UTF-16 (wchar_t), когда он используется (отображается, печатается или используется в качестве имени файла). Чтобы преобразовать обратно, вы должны использовать функцию MultiByteToWideChar
.
Просто чтобы прояснить: многобайтовый код ANSI - это всего лишь подмножество всего Unicode. Windows использует то же подмножество, что и ваше местоположение в Windows (вы можете настроить его в Панель управления ). Если у вас есть настоящая строка Юникода или нет строки, основанной на локали, вы должны оставить все символы в Юникоде. Если вы хотите работать с однобайтовой строкой и Unicode, вам следует перенести вашу строку wchar_t
(все символы в Windows - UTF-16) в строку UTF-8 Unicode.
Проверьте этот источник:
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 );
}