3

如果我正在为 Windows 开发并且某些 WinAPI 函数要求我使用 LPWSTR 作为字符串数据类型。在我的库中使用 C++11 的 u16string 可以吗?这两种数据类型是一样的吗?

它看起来更像 LPWSTR 是 wchar_t,但没有人喜欢 wchar_t 了......

4

3 回答 3

2

C++11char16_t类型不同于wchar_t. 从理论上讲,您可以reinterpret_castchar16_t*和 Windows'之间进行选择wchar_t*(Windows'wchar_t是 16 位)。然而,在实践中,Visual C++ 10.0——我认为也是 Visual C++ 11.0——缺乏对 Unicode 文字的支持,例如u'A'or u"A"

总结一下(我发现在 SO 上应该更好地明确所有结论):

  • “在我的库中使用 C++11 的 u16string 可以吗?”
    当然,但不是作为字符串的直接插件替代品,wchar_t如果您计划支持 Visual C++,那么截至 2012 年目前存在问题(由于缺乏对文字的支持)。

  • “这两种数据类型是一样的吗?”
    不。

  • “没有人喜欢 wchar_t 了……”
    当然不是这样。

于 2012-08-24T00:56:15.230 回答
2

wchar_t并且char16_t是不同的类型,因此不能u16string.c_str()用作 a LPWSTR(没有 areinterpret_cast会导致未定义的行为)。

如果您确信在您的平台上wchar_t被编码为 UTF-16,您可以将数据复制到:

std::wstring my_wstring(my_u16string.begin(), my_u16string.end());

然后my_wstring.c_str()用作 LPWSTR。在函数调用中,您可以使用临时:

SomeWindowsAPI(std::wstring(my_u16string.begin(), my_u16string.end()).c_str());
于 2012-08-24T09:57:06.167 回答
1

wchar_t在 Windows 上是 16 位的,并且LPWSTR值是 UTF-16 编码的,所以是的,您可以在与 API 交互时使用char16_tu16string值,尽管您必须进行类型转换才能让编译器满意。

于 2012-08-24T01:33:35.933 回答