Я хотел бы прочитать тест utf-8 из таблицы строк DLL.
что-то вроде этого
LPWSTR nnW;
LoadStringW(hMod, id, nnW, MAX_PATH);
и после этого я хотел бы преобразовать LPWSTR nnW
в std::wstring nnWstring
,
Я пытался таким образом:
LPWSTR nnW;
LoadStringW (hMod, id, nnW, MAX_PATH);
const int length = MultiByteToWideChar(CP_UTF8,
0, // no flags required
(LPCSTR)nnW,
-1, // automatically determine length
NULL,
0);
std::wstring nnWstring(length, L'\0');
if (!MultiByteToWideChar(CP_UTF8,
0,
(LPCSTR)nnW,
-1,
&nnWstring[0],
length))
MessageBoxW(NULL, (LPCWSTR)nnWstring.c_str(), L"wstring", MB_OK | MB_ICONERROR);
После этого в MessageBoxW отображается только первая буква.
Нет необходимости в конвертации или копировании.
std::wstring nnWString(MAX_PATH, 0);
nnWString.resize(LoadStringW(hMod, id, &nnWString[0], nnWString.size());
Примечание: ваш оригинальный код вызывает неопределенное поведение, потому что он пишет с использованием неинициализированного указателя. Конечно, не то, что вы хотели.
Вот еще один вариант:
Я хотел бы прочитать тест utf-8 из таблицы строк DLL. что-то вроде этого
Обычно таблицы строк в Windows имеют формат UTF-16. Вы пытаетесь объединить данные UTF-8 в одно. Данные UTF-8 обрабатываются как «расширенный» ASCII, поэтому каждый байт расширяется до двух байтов с нулевыми байтами между ними.
Вы, вероятно, должны поместить данные UTF-16 непосредственно в таблицу строк.
Если вам необходимо хранить данные UTF-8 в ресурсах, вы можете поместить их в ресурс RCDATA и использовать функции ресурса более низкого уровня для вывода данных. Затем вам придется конвертировать из UTF-8 в UTF-16, чтобы сохранить его в wstring.