WinAPI LPWSTR,C ++ 11 u16string?

时间:2012-08-24 00:07:24

标签: c++ winapi unicode c++11

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

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

3 个答案:

答案 0 :(得分:2)

C ++ 11 char16_t类型与wchar_t不同。从理论上讲,您可以reinterpret_castchar16_t*和Windows'wchar_t*之间(Windows'wchar_t为16位)。但实际上,Visual C ++ 10.0 - 我认为Visual C ++ 11.0 - 缺乏对u'A'u"A"等Unicode文字的支持。

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

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

  • “这两种数据类型是否相同?”否。

  • “没人再喜欢wchar_t了......”
    情况肯定不是这样。

答案 1 :(得分:2)

wchar_tchar16_t是不同的类型,因此无法将u16string.c_str()用作LPWSTR(没有reinterpret_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());

答案 2 :(得分:1)

Windows上的

wchar_t为16位,LPWSTR值为UTF-16编码,因此,是的,您可以在与...进行交互时使用char16_tu16string值API,虽然您必须进行类型转换以保持编译器满意。