wchar以单个空字节或其中两个结尾?

Kos*_*mos 8 c++ string null byte wchar

我只是不明白,也找不到关于wchar end的更多信息.

如果它以单个空字节结束,它是如何知道它不是字符串结束,如果像"009A"这样的东西代表一个unicode符号?

如果以两个空字节结束?好吧,我不确定,需要确认.

小智 9

由于宽字符串是宽字符数组,因此它甚至不能以单字节NUL结尾.这是一个两字节的NUL.(C/C++中的数组只能保存相同类型的成员,因此大小相同).

此外,对于ASCII标准字符,总是有一个或三个单字节0,因为只有扩展字符以非零第一字节开始(取决于wchar_t是16位还是32位 - 为简单起见,我假设为16位和小端):

HELLO is 72 00 69 00 76 00 76 00 79 00 00 00
Run Code Online (Sandbox Code Playgroud)

  • @ H2CO3:在我的系统上,`sizeof(wchar_t)== 4`.你似乎也在做关于字节序的假设. (2认同)

Jor*_*lez 5

在这里您可以阅读更多宽字符:http : //en.wikipedia.org/wiki/Wide_character#Size_of_a_wide_character

终止符是 L'\0',表示一个 16 位空字符,所以它就像两个 8 位空字符。

请记住,“009A”只有 1 个 wchar,因此不是空 wchar。


Kei*_*son 5

在C中(引用N1570草案,第7.1.1节):

宽字符串是由封端的宽字符的连续序列,并且包括第一个空宽字符.

其中"宽字符"是类型的值,以整数类型wchar_t定义<stddef.h>.

我在C++标准的N3337草案中找不到"宽字符串"的定义,但它应该是类似的.一个小的区别是wchar_tC中的typedef和C++中的内置类型(名称是关键字).但是由于C++共享大部分C库,包括作用于宽字符串的函数,因此可以安全地假设C和C++定义是兼容的.(如果有人能在C++标准中找到更具体的内容,请评论或编辑此段落.)

在C和C++中,a的大小wchar_t是实现定义的.它通常是2或4个字节(16或32位,除非你是一个非常奇特的系统,字节大于8位).宽字符串是一系列宽字符(wchar_t值),以空宽字符结尾.终止宽字符将具有与任何其他宽字符相同的大小,通常为2或4个字节.

特别是,如果wchar_t大于char,则单个空字节不会终止宽字符串.

值得注意的是,字节顺序是实现定义的.0x1234当作为8位字节序列查看时,具有该值的宽字符可能显示为以下任何一个:

  • 0x12, 0x34
  • 0x34, 0x12
  • 0x00,0x00,0x12,0x34
  • 0x34,0x12,0x00,0x00

而这些并非唯一的可能性.