3

我想从 .dll 字符串表中读取 utf-8 测试。像这样的东西

LPWSTR nnW;
LoadStringW(hMod, id, nnW, MAX_PATH);

之后我想将其转换LPWSTR nnWstd::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 中只显示第一个字母。

4

2 回答 2

6

无需转换或复制。

std::wstring nnWString(MAX_PATH, 0);
nnWString.resize(LoadStringW(hMod, id, &nnWString[0], nnWString.size());

注意:您的原始代码会导致未定义的行为,因为它使用未初始化的指针进行写入。肯定不是你想要的。

这是另一个变体:

于 2013-04-01T22:17:33.000 回答
1

我想从 .dll 字符串表中读取 utf-8 测试。像这样的东西

通常,Windows 中的字符串表是 UTF-16。您正在尝试将 UTF-8 数据合二为一。UTF-8 数据被视为“扩展”ASCII,因此每个字节都被扩展为两个字节,它们之间有零字节。

您可能应该将 UTF-16 数据直接放入字符串表中。

如果必须在资源中存储 UTF-8 数据,可以将其放入 RCDATA 资源中,并使用较低级别的资源函数将数据取出。然后,您必须将其从 UTF-8 转换为 UTF-16 才能将其存储在 wstring 中。

于 2013-04-01T23:29:07.583 回答