4

我知道 UTF-16 有两种字节序:大字节序和小字节序。

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

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

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

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

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

4

4 回答 4

5

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

为了确定(如果这确实是您想要做的)字节顺序(您自己),您可以尝试将一个已知的 32 位(无符号整数)值写入 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++ 才真正只编译到英特尔类型的处理器。他们真的只有一种字节序类型。

于 2013-02-04T18:32:10.387 回答
2

它是实现定义的。wstring 只是 wchar_t 的字符串,它可以是任何字节顺序,或者就此而言,任何旧大小。

于 2013-02-04T18:27:27.740 回答
1

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

在将它发送到任何地方之前,您必须使用将 wstring 转换为 UTF-16 字节流的显式过程。wchar 的内部字节序依赖于体系结构,最好使用一些不透明的接口进行转换,而不是尝试手动转换。

于 2013-02-04T18:41:45.663 回答
0

为了发送正确的 BOM,您不需要知道字节顺序。只需使用代码 \uFEFF。这将是 bigendian 或 little-endian,具体取决于您的实现的字节序。您甚至不需要知道您的实现是 UTF-16 还是 UTF-32。只要它是某种 unicode 编码,您就会得到适当的 BOM。

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

于 2013-02-04T20:44:49.887 回答