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

Posted

技术标签:

【中文标题】wchar 以单个或两个空字节结尾?【英文标题】:wchar ends with single null byte or two of them? 【发布时间】:2012-08-31 14:45:35 【问题描述】:

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

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

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

【问题讨论】:

在 C++ 中,我不知道 wchar 存在于其他地方 有些相关:Making a WCHAR null terminated。那里可能有一些关于如何解决这个问题的提示。 在 C++ 中,wchar_t(不是wchar)是预定义的类型。在 C 中,wchar_t 是在 <stddef.h> 中定义的 typedef。在这两种情况下,大小都是由实现定义的;在我的系统上,它的大小是 4 字节(32 位)。 【参考方案1】:

由于宽字符串是宽字符数组,它甚至不能以单字节 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

【讨论】:

err,所以如果我像这样访问 wchar 数组:arr[0] = 0;它会自动将第一个和第二个字节设置为零吗? @Kosmos (如果还不清楚,我建议你阅读关于 C 指针和数组的好教程!) @Kosmos 有一些库可以将 UTF-16(宽字符串)转换为 UTF-8。 @H2CO3:在我的系统上,sizeof (wchar_t) == 4。您似乎也在对字节顺序做出假设。 @H2CO3: "only extended characters start by a non-zero first byte" -- 假设大端(你最近的编辑,你已经做出了明确的假设)。【参考方案2】:

如果你声明

WCHAR tempWchar[BUFFER_SIZE];

你让它为空

for (int i = 0; i < BUFFER_SIZE; i++)
            tempWchar[i] = NULL;

【讨论】:

【参考方案3】:

在 C 中(引用 the N1570 draft,第 7.1.1 节):

宽字符串是一个连续的宽字符终止序列 通过并包括第一个空宽字符。

其中“宽字符”是wchar_t 类型的值,在&lt;stddef.h&gt; 中定义为整数类型。

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

在 C 和 C++ 中,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

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

【讨论】:

【参考方案4】:

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

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

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

【讨论】:

以上是关于wchar 以单个或两个空字节结尾?的主要内容,如果未能解决你的问题,请参考以下文章

wchar_t 数据是不是需要字节序转换?

将两个字节合并为 WideChar

C++搞懂char与wchar_t字符串

wchar_t类型的几个函数

怎样把Cstring转换成wchar

Windows程序设计笔记