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

时间:2013-02-04 18:24:30

标签: 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,我该如何可靠地确定其字节序?

4 个答案:

答案 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。