如果我正在为 Windows 开发并且某些 WinAPI 函数要求我使用 LPWSTR 作为字符串数据类型。在我的库中使用 C++11 的 u16string 可以吗?这两种数据类型是一样的吗?
它看起来更像 LPWSTR 是 wchar_t,但没有人喜欢 wchar_t 了......
C++11char16_t
类型不同于wchar_t
. 从理论上讲,您可以reinterpret_cast
在char16_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 了……”
当然不是这样。
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());
wchar_t
在 Windows 上是 16 位的,并且LPWSTR
值是 UTF-16 编码的,所以是的,您可以在与 API 交互时使用char16_t
和u16string
值,尽管您必须进行类型转换才能让编译器满意。