11

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

如果它以单个空字节结尾,它怎么知道它不是字符串结尾呢,如果像“009A”这样的东西代表一个unicode符号?

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

4

4 回答 4

12

由于宽字符串是宽字符数组,因此它甚至不能以单字节 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
于 2012-09-06T18:13:16.977 回答
5

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

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

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

于 2012-09-06T18:12:02.563 回答
5

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

宽字符串是一个连续的宽字符序列,以第一个空宽字符终止并包括在内。

其中“宽字符”是 type 的值,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

这些并不是唯一的可能性。

于 2012-09-06T19:36:03.340 回答
1

如果你声明

WCHAR tempWchar[BUFFER_SIZE];

你让它为空

for (int i = 0; i < BUFFER_SIZE; i++)
            tempWchar[i] = NULL;
于 2016-11-02T19:43:00.030 回答