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



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

C++标准是否定义了std::wstring的endianness?还是由实现定义?

如果它是标准定义的,C++标准的哪一页提供了关于这个问题的规则?

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

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

简而言之:给定一个std::wstring,我应该如何可靠地确定它的endianness

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

为了确定(如果这真的是你想要做的)endianes(自己),你可以尝试将一个KNOWN32位(无符号int)值写入ram,然后使用char指针将其读回。查找返回的订单。

它看起来像这样:

unsigned int aVal = 0x11223344;
char * myValReadBack = (char *)(&aVal);
if(*myValReadBack == 0x11) printf("Big endianrn");
else                       printf("Little endianrn");

我确信还有其他方法,但像上面这样的方法应该有效,检查我的小与大:-)

此外,在Windows RT之前,VC++实际上只编译到英特尔类型的处理器。它们实际上只有1个endianes类型。

它是实现定义的。wstring只是wchar_t的一个字符串,它可以是任何字节顺序,也可以是任何旧的大小。

wchar_t在内部不需要是UTF-16,并且UTF-16字节序不会影响wchar的存储方式,而是保存和读取它的问题。

在将wstring发送到任何位置之前,必须使用一个显式过程将其转换为UTF-16字节流。wchar的内部字节序依赖于体系结构,与其尝试手动转换,不如使用一些不透明的接口进行转换。

为了发送正确的BOM,您不需要知道endianness。只需使用代码\uFEFF。这将是bigendian或little-endian,具体取决于实现的endianness。您甚至不需要知道您的实现是UTF-16还是UTF-32。只要是一些unicode编码,您最终就会得到合适的BOM。

不幸的是,wchars和宽流都不能保证是unicode。

相关内容

最新更新