我只是不明白,也找不到太多关于 wchar end 的信息。
如果它以单个空字节结尾,它怎么知道它不是字符串结尾呢,如果像“009A”这样的东西代表一个unicode符号?
如果它以两个空字节结尾?好吧,我不确定,需要确认。
由于宽字符串是宽字符数组,因此它甚至不能以单字节 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
在这里您可以阅读更多宽字符:http ://en.wikipedia.org/wiki/Wide_character#Size_of_a_wide_character
终止符是 L'\0',表示 16 位空字符,因此它就像两个 8 位空字符。
请记住,“009A”只有 1 个 wchar,所以不是空 wchar。
在 C 中(引用N1570 草案,第 7.1.1 节):
宽字符串是一个连续的宽字符序列,以第一个空宽字符终止并包括在内。
其中“宽字符”是 type 的值,wchar_t
定义<stddef.h>
为整数类型。
我在 C++ 标准的 N3337 草案中找不到“宽字符串”的定义,但应该是类似的。一个小的区别是wchar_t
C 中的 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
这些并不是唯一的可能性。
如果你声明
WCHAR tempWchar[BUFFER_SIZE];
你让它为空
for (int i = 0; i < BUFFER_SIZE; i++)
tempWchar[i] = NULL;