Хранение и извлечение строк UTF-8 из файлов ресурсов Windows (RC)

Я создал RC-файл, который содержит таблицу строк, я хотел бы использовать некоторые специальные

персонажи: ö ü ó ú ő ű é. поэтому я сохраняю строку в кодировке UTF-8.

Но когда я вызываю в моем файле cpp, что-то вроде этого:

LoadString("hu.dll", 12, nn, MAX_PATH);

Я получаю странный результат:

Сообщение об ошибке с неожиданными символами

Как мне решить эту проблему?

2

Решение

Как отмечали другие в комментариях, 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, либо в настройках сборки вашего проекта.
8

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]