什么是Visual Studio 2015的UTF-16编码string的内存布局?

WinAPI使用wchar_t缓冲区。 据我所知,我们需要使用UTF-16编码我们所有的参数到WinAPI。

我们有两个版本的UTF-16: UTF-16beUTF-16le 。 假设编码一个string“Example” 0x45 0x78 0x61 0x6d 0x70 0x6c 0x65 。 用UTF-16be字节应该这样放置: 00 45 00 78 00 61 00 6d 00 70 00 6c 00 65 。 UTF-16le应该是45 00 78 00 61 00 6d 00 70 00 6c 00 65 00 。 (我们正在省略BOM)。 同一个string的字节表示是不同的。

根据文档Windows使用UTF-16le 。 这意味着我们应该用UTF-16le对所有的string进行编码,否则将无法工作。

同时,我的编译器(VS2015)使用UTF-16be作为硬编码到我的代码中的string(像L"my test string" )。 但是WinAPI可以很好地处理这些string。 为什么它的作品? 我错过了什么?

更新1:

testing硬编码string的字节表示我使用下面的代码:

 std::string charToHex(wchar_t ch) { const char alphabet[] = "0123456789ABCDEF"; std::string result(4, ' '); result[0] = alphabet[static_cast<unsigned int>((ch & 0xf000) >> 12)]; result[1] = alphabet[static_cast<unsigned int>((ch & 0xf00) >> 8)]; result[2] = alphabet[static_cast<unsigned int>((ch & 0xf0) >> 4)]; result[3] = alphabet[static_cast<unsigned int>(ch & 0xf)]; return std::move(result); } 

小端或大端描述了超过8位的变量存储在内存中的方式。 你设计的测试不测试内存布局,它直接使用wchar_t类型; 整数类型的高位总是高位,不管CPU是大端还是小端!

对代码的这种修改将显示它是如何工作的。

 std::string charToHex(wchar_t * pch) { const char alphabet[] = "0123456789ABCDEF"; std::string result; unsigned char * pbytes = static_cast<unsigned char *>(pch); for (int i = 0; i < sizeof(wchar_t); ++i) { result.push_back(alphabet[(pbytes[i] & 0xf0) >> 4]; result.push_back(alphabet[pbytes[i] & 0x0f]; } return std::move(result); }