Windows上的wchar_t和char16_t是否相同?

时间:2018-11-14 04:22:30

标签: c++ windows winapi unicode char

我有一个std::u16string的实例,是否可以将其c_str()传递给期望LPCWSTR的Win32 API,而无需进行任何转换?例如,我可以安全地这样做吗?

auto u16s = std::u16string(u"Hello");
::SetWindowTextW(hWnd, reinterpret_cast<LPCWSTR>(u16s.c_str()));    

已更新,MSDN说here wchar_t是UTF-16LE,而char16_t只是UTF-16,未指定字节序。是否可以安全地假设char16_t在Windows上也总是UTF-16LE?还是那是特定于MSVC编译器的,所以例如,如果我遵守GCC,它就可能是UTF-32LE(或UTF-16BE)吗?

2 个答案:

答案 0 :(得分:5)

我想对@jamesdlin的anwser进行修改,尽管他的回答是正确的。

在C ++ 11之前,有charwchar_t,因此将std::basic_string<>专用于std::stringstd::wstring

但是,wchar_t的位宽度是特定于平台的:在Windows上是16位,而在其他平台上是32位。

随着C ++ 11的到来,标准adds char16_t代表16位宽的字符;因此,在Windows上,std::u16string可以与std::wstring互换,因为它们都可以表示16位宽的字符。

  

wchar_t类型是实现定义的宽字符类型。在   Microsoft编译器,它表示一个16位宽的字符,用于   存储编码为UTF-16LE的Unicode,即本机字符类型   Windows操作系统。

但是最新的MSDN似乎为使用std::wstring的代码添加了一些aside notes,但仍打算可移植:

  

wchar_t的大小由实现定义。如果您的代码取决于   wchar_t一定大小,请检查平台的实现   (例如,使用sizeof(wchar_t))。如果您需要字符串字符   类型,宽度保证在所有范围内都保持不变   平台,请使用字符串,u16string或u32string。

对于LE(little-endian),它应该是特定于体系结构的IIRC。当今大多数架构都使用LE。

答案 1 :(得分:2)

相关问题