Visual C ++ - UTF-8 - CA2W, за которым следует CW2T с MBCS - возможно, плохая идея? - PullRequest
1 голос
/ 13 марта 2019

Я использую библиотеку, которая создает строки с нулевым символом в конце UTF-8 типа const char*.Примеры включают:

MIGUEL ANTÓNIO
DONA ESTEFÂNIA

Я хотел бы преобразовать эти два const char* типа в CString так, чтобы они читали:

MIGUEL ANTÓNIO
DONA ESTEFÂNIA

Для этого я используюследующую функцию, которую я сделал:

CString Utf8StringToCString(const char * s)
{
    CStringW ws = CA2W(s, CP_UTF8);
    return CW2T(ws);
}

Функция, кажется, делает то, что я хочу (по крайней мере, для этих двух случаев).Тем не менее, мне интересно: хорошо ли вообще использовать макрос CA2W, а затем CW2T?Я делаю какое-то преобразование с потерями, делая это?Есть ли побочные эффекты, о которых я должен беспокоиться?

Некоторые другие детали:

  1. Я использую Visual Studio 2015
  2. Мое приложение скомпилировано с использованием Используйте многобайтовый набор символов

1 Ответ

1 голос
/ 13 марта 2019

Даже если ваше приложение скомпилировано как MBCS, вы все равно можете без проблем использовать строки, буферы Unicode и API-интерфейсы Windows Unicode.

Передавайте строки как UTF-8 либо с необработанным указателем (const char*), либо в классе строк, таком как CString или std::string. Когда вам действительно нужно отобразить строку для отображения, преобразуйте ее в Unicode и явно используйте API W.

Например:

void UpdateDisplayText(const char* s)
{
    CStringW ws = CA2W(s, CP_UTF8);
    SetDlgItemTextW(m_hWnd, IDC_LABEL1, ws);
}
...