什么是标准定义的std :: wstring的字节序?

xml*_*lmx 2 c++ string unicode standards endianness

我知道UTF-16有两种类型的endianness:big endian和little endian.

C++标准是否定义了std :: wstring的字节顺序?或者它是实现定义的?

如果它是标准定义的,那么C++标准的哪个页面提供了有关此问题的规则?

如果它是实现定义的,如何确定它?例如在VC++下.编译器是否保证std :: wstring的字节序严格依赖于处理器?

我必须知道这一点; 因为我想将UTF-16字符串发送给其他人.我必须在UTF-16字符串的开头添加正确的BOM以指示其字节顺序.

简而言之:给定一个std :: wstring,我该如何可靠地确定它的字节序?

tru*_*cks 5

Endianess依赖于MACHINE,而不依赖于语言.Endianess由处理器定义,以及它如何在内存中排列数据.当处理wchar_t(比单个字节宽)时,处理器本身在读或写时根据需要对齐多个字节,以便再次读取或写回RAM.代码只是将其视为处理器内部寄存器中表示的16位(或更大)字.

为了确定(如果那是你想要做的)endianess(你自己),你可以尝试将一个KNOWN 32位(unsigned int)值写入ram,然后使用char指针读回它.查找返回的排序.

它看起来像这样:

unsigned int aVal = 0x11223344;
char * myValReadBack = (char *)(&aVal);

if(*myValReadBack == 0x11) printf("Big endian\r\n");
else                       printf("Little endian\r\n");
Run Code Online (Sandbox Code Playgroud)

我确定还有其他方法,但上面的东西应该工作,检查我的小与大虽然:-)

此外,直到Windows RT,VC++才真正编译为intel类型的处理器.他们真的只有1个endianess类型.