C++ 什么';标准定义的std::wstring的端点是多少?

C++ 什么';标准定义的std::wstring的端点是多少?,c++,string,unicode,standards,endianness,C++,String,Unicode,Standards,Endianness,我知道UTF-16有两种端部:大端部和小端部 C++标准是否定义了STD::或者它是实现定义的 如果是标准定义,C++标准的哪个页面在这个问题上提供规则?< /P> 如果是实现定义的,如何确定?e、 g.在VC++下。编译器是否保证std::wstring的endianness严格依赖于处理器 我必须知道这一点;因为我想把UTF-16字符串发送给其他人。我必须在UTF-16字符串的开头添加正确的BOM,以指示其结尾 简而言之:给定一个std::wstring,我应该如何可靠地确定它的结尾?它是

我知道UTF-16有两种端部:大端部和小端部

<> C++标准是否定义了STD::或者它是实现定义的

如果是标准定义,C++标准的哪个页面在这个问题上提供规则?< /P>


如果是实现定义的,如何确定?e、 g.在VC++下。编译器是否保证std::wstring的endianness严格依赖于处理器

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


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

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

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

为了确定(如果这真的是您想要做的)endianess(您自己),您可以尝试将一个已知的32位(无符号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");
我相信还有其他的方法,但是像上面这样的方法应该有效,检查一下我的小对大:-)


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

wchar\u t
在内部不需要是UTF-16,UTF-16 endianness不会影响wchar的存储方式,只需保存和读取它


在将wstring发送到任何地方之前,必须使用一个显式过程将其转换为UTF-16 ByTestStream。wchar的内部端性取决于体系结构,最好使用一些不透明接口进行转换,而不是尝试手动转换

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


不幸的是,wchars和wide streams都不能保证是unicode。

标准甚至没有指定
wchar\u t
的大小,它不会给出一个endianness。你为什么需要知道这一点?Endianness主要依赖于架构。@EalGray,我必须知道这一点,因为我想将UTF-16字符串发送给其他人。我必须在开始时添加正确的BOM。
wstring
完全由实现定义。。。如果您与他人进行交流,它将不会受到所有这些问题的影响。@xmllmx:1)如果Endianness已经存在于内存中,则不需要知道Endianness。就像你在求整数和的时候不在乎整数的长度一样。等于0x0123的wchar________________________________________。2) “编译器填充字符”?你是说“字符串文字”吗?那么,如何使用UTF-8字符串文字,如
u8所示“如果它是实现定义的,那么如何确定它?e、 在VC++下。它将包含你放在里面的任何东西。在VC++上,wchar__t是16位,如果您从WinAPI获取字符串,它们将具有本机硬件字节顺序。编译器是否保证std::wstring的endianness严格依赖于处理器?@xmllmx否,它不会。这就是为什么我建议不要弄乱wstring的内部结构,并使用一些标准接口来正确转换它。这个问题仍然没有解决。给定一个std::wstring,我应该如何可靠地确定它的终止性?谢谢。MSDN的哪一页指定“VC++实际上只编译到intel类型的处理器。它们实际上只有1个endianess类型。”?@xmllmx-没有MSDN会这样说。这是我自己的结论。VC++是微软C++编译器。只有在X86处理器上存在Windows 8 RT之前,Windows才具有。X86处理器一直都是小端处理器。看这里:。现在,如果您要向big-endian机器发送或从big-endian机器接收数据,您可能必须转换为/从,但如果您所要做的只是理解您自己的内部机器的endian类型,这甚至不需要代码,您应该能够知道(在您的例子中是“little-endian”)@trumpetlicks Windows已经存在于非x86平台上(如PPC)在Windows RT之前很久,也有VisualC++出现。但是,我记得读它从来没有什么小的字节序。有些处理器支持大的和小的EnDad模式,但是Windows需要那些处理器以小的EnDad模式运行。@ HVD我认为你可能错了,但是维基百科同意你:啊,找到了。我在那里读到: