Неверное преобразование символов в японских системах - PullRequest
1 голос
/ 14 февраля 2012

У меня есть проект, который скомпилирован с многобайтовым набором символов.Приведенное ниже преобразование завершается неудачно, когда msg1 содержит японские символы.

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

При вводе msg1 - это BSTR, содержащий символы Юникода и имя пути на японском языке.Преобразование CW2A, кажется, работает в том, что после вызова msg содержит строку, узнаваемую на японском языке.Однако назначение LPCTSTR не выполняется.После строки p0 содержит мусор.Строка p0 используется впоследствии в старом коде, который я не хочу касаться.

Как правильно в этом случае получить указатель на строку «msg»?

На английском все работаетхорошо.

1 Ответ

0 голосов
/ 14 февраля 2012

Попробуйте использовать 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 );
}
...