我想从.dll字符串表中读取utf-8测试。 像这样的东西
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中只显示第一个字母。
答案 0 :(得分:4)
无需转换或复制。
std::wstring nnWString(MAX_PATH, 0);
nnWString.resize(LoadStringW(hMod, id, &nnWString[0], nnWString.size());
注意:您的原始代码会导致未定义的行为,因为它使用未初始化的指针进行写入。当然不是你想要的。
这是另一种变体:
答案 1 :(得分:1)
我想从.dll字符串表中读取utf-8测试。像这样的东西
通常,Windows中的字符串表是UTF-16。您正在尝试将UTF-8数据合二为一。 UTF-8数据被视为“扩展”ASCII,因此每个字节被扩展为两个字节,它们之间只有零字节。
你应该把UTF-16数据直接放在字符串表中。
如果必须在资源中存储UTF-8数据,则可以将其放入RCDATA资源并使用较低级别的资源函数来获取数据。然后你必须从UTF-8转换为UTF-16以将其存储在wstring中。