我有一个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)吗?
答案 0 :(得分:5)
我想对@jamesdlin的anwser进行修改,尽管他的回答是正确的。
在C ++ 11之前,有char
和wchar_t
,因此将std::basic_string<>
专用于std::string
和std::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)