Я создал RC-файл, который содержит таблицу строк, я хотел бы использовать некоторые специальные
персонажи: ö ü ó ú ő ű é. поэтому я сохраняю строку в кодировке UTF-8.
Но когда я вызываю в моем файле cpp, что-то вроде этого:
LoadString("hu.dll", 12, nn, MAX_PATH);
Я получаю странный результат:
Как мне решить эту проблему?
Как отмечали другие в комментариях, API-интерфейсы Windows не обеспечивают прямой поддержки текста в кодировке UTF-8. Вы не можете передать MessageBox
Функция UTF-8 кодирует строки и получает ожидаемый результат. Вместо этого он будет интерпретировать их как символы в вашей локальной кодовой странице.
Чтобы получить строку UTF-8 для передачи в функции Windows API (включая MessageBox
), вам нужно использовать MultiByteToWideChar
функция для преобразования из UTF-8 в UTF-16 (что Windows называет Unicode, или широкие строки). Проходя CP_UTF8
Флаг для первого параметра — это магия, которая включает это преобразование. Пример:
std::wstring ConvertUTF8ToUTF16String(const char* pszUtf8String)
{
// Determine the size required for the destination buffer.
const int length = MultiByteToWideChar(CP_UTF8,
0, // no flags required
pszUtf8String,
-1, // automatically determine length
nullptr,
0);
// Allocate a buffer of the appropriate length.
std::wstring utf16String(length, L'\0');
// Call the function again to do the conversion.
if (!MultiByteToWideChar(CP_UTF8,
0,
pszUtf8String,
-1,
&utf16String[0],
length))
{
// Uh-oh! Something went wrong.
// Handle the failure condition, perhaps by throwing an exception.
// Call the GetLastError() function for additional error information.
throw std::runtime_error("The MultiByteToWideChar function failed");
}
// Return the converted UTF-16 string.
return utf16String;
}
Затем, когда у вас есть широкая строка, вы явно вызовете вариант широкой строки MessageBox
функция, MessageBoxW
,
Однако, если вам нужна только поддержка Windows, а не других платформ, которые повсеместно используют UTF-8, вам, вероятно, будет гораздо проще придерживаться исключительно строк в кодировке UTF-16. Это родная кодировка Unicode, которую использует Windows, и вы можете передавать эти типы строк непосредственно в любую из функций Windows API. Увидеть мой ответ здесь узнать больше о взаимодействии между функциями Windows API и строками. Я рекомендую вам то же самое, что и другому парню:
wchar_t
а также std::wstring
для ваших персонажей и строк соответственно. W
варианты функций Windows API, в том числе LoadStringW
а также MessageBoxW
,UNICODE
а также _UNICODE
Макросы определяются либо до того, как вы добавите заголовки Windows, либо в настройках сборки вашего проекта.Других решений пока нет …