我知道UTF-16有两种类型的endianness:big endian和little endian。
C ++标准是否定义了std :: wstring的字节顺序?或者它是实现定义的?
如果它是标准定义的,那么C ++标准的哪一页提供了有关此问题的规则?
如果是实现定义的,如何确定它?例如在VC ++下。编译器是否保证std :: wstring的字节序严格依赖于处理器?
我必须知道这一点;因为我想将UTF-16字符串发送给其他人。我必须在UTF-16字符串的开头添加正确的BOM以指示其字节顺序。
简而言之:给定一个std :: wstring,我该如何可靠地确定其字节序?
答案 0 :(得分: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");
我确定还有其他方法,但上面的内容应该有效,请检查我的小与大: - )
此外,直到Windows RT,VC ++才真正编译为intel类型的处理器。他们真的只有1个endianess类型。
答案 1 :(得分:2)
它是实现定义的。 wstring只是一个wchar_t的字符串,可以是任何字节顺序,或者就此而言,任何旧的大小。
答案 2 :(得分:0)
wchar_t
内部不需要是UTF-16,UTF-16字节序不会影响wchar的存储方式,而是保存和读取它。
您必须使用将wstring转换为UTF-16字节流的显式过程,然后再将其发送到任何地方。 wchar的内部字节序取决于体系结构,使用一些不透明的接口进行转换比尝试手动转换更好。
答案 3 :(得分:-1)
为了发送正确的BOM,您不需要知道字节顺序。只需使用代码\ uFEFF即可。这将是bigendian或little-endian,具体取决于您的实现的字节顺序。您甚至不需要知道您的实现是UTF-16还是UTF-32。只要它是一些unicode编码,你就会得到适当的BOM。
不幸的是,无论是wchars还是宽流都不能保证是unicode。