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
类型的值,在<stddef.h>
中定义为整数类型。
我在 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 以单个或两个空字节结尾?的主要内容,如果未能解决你的问题,请参考以下文章