avo*_*avo 2 c++ windows unicode winapi char
我有一个实例std::u16string,是否可以将其传递c_str()给Win32 API LPCWSTR,而不需要任何转换?例如,我可以安全地执行此操作:
auto u16s = std::u16string(u"Hello");
::SetWindowTextW(hWnd, reinterpret_cast<LPCWSTR>(u16s.c_str()));
Run Code Online (Sandbox Code Playgroud)
更新后,MSDN说这里 wchar_t是UTF-16LE,而char16_t只是UTF-16,没有指定endian.是否可以安全地假设char16_t在Windows上也始终是UTF-16LE?或者那将是MSVC编译器特定的,因此如果我与GCC合作,它可能是UTF-32LE(或者可能是UTF-16BE)?
虽然他的回答是正确的,但我想对@ jamesdlin的anwser进行修正.
在C++ 11之前,有char和wchar_t,因而专注std::basic_string<>于std::string和std::wstring.
但是,宽度(以位为单位)wchar_t是特定于平台的:在Windows上它是16位,而在其他平台上,它是32位.
随着C++ 11的出现,标准增加 char16_t了代表16位宽的字符; 因此在Windows上,std::u16string恰好可以std::wstring在大多数情况下互换,因为它们都能够代表16位宽的字符.
wchar_t类型是实现定义的宽字符类型.在Microsoft编译器中,它表示一个16位宽的字符,用于存储编码为UTF-16LE的Unicode,这是Windows操作系统上的本机字符类型.
但最新的MSDN似乎为代码添加了一些备注,std::wstring但仍打算可移植:
wchar_t的大小是实现定义的.如果您的代码依赖于wchar_t为特定大小,请检查平台的实现(例如,使用sizeof(wchar_t)).如果您需要一个字符串字符类型,其宽度保证在所有平台上保持不变,请使用string,u16string或u32string.
对于LE(little-endian),它应该是特定于体系结构的IIRC.今天大多数架构使用LE.