LPWSTR到wstring c ++

时间:2013-04-01 22:14:45

标签: c++ wstring

我想从.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中只显示第一个字母。

2 个答案:

答案 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中。