UTF-16字符串终止符

15

UTF-16字符串的字符串终止序列是什么?

编辑:

我重新解释一下问题,以便澄清。调用 wcslen() 的工作原理是怎样的?


+1 不管它会引起“错误问题”类型的回答,我喜欢这种类型的问题,因为这正是谷歌和维基百科无法告诉你的事情。 - sehe
2
可能是因为它太明显了。 :-) 顺便说一下,C 不允许使用 UTF-16 作为 wchar_t 的编码方式,这是因为它与 C 宽字符 API 不兼容,该 API 假定每个多字节字符对应于一个 单独的 wchar_t 值,而不是一系列的 wchar_t 值。如果你坚持要将 wchar_t 设为 16 位,那么你只能使用 UCS-2 或者不符合标准要求的标准函数。 - R.. GitHub STOP HELPING ICE
在我使用过的每个系统上,sizeof(wchar_t)都等于4个字节或32位。否则我认为它不会起作用。 - tchrist
Microsoft Visual C++的sizeof(wchar_t) == 2, 这让需要编写支持Unicode跨平台库的程序员感到非常恼火。 - dan04
3个回答

17

Unicode不定义字符串终止符,这取决于您的环境或语言。例如,C字符串使用0x0作为字符串终止符,而在.NET字符串中,String类中使用一个单独的值来存储字符串的长度。

至于您的第二个问题,wcslen寻找终止的L'\0'字符。根据我所看到的,这个字符的长度取决于编译器,但如果您使用UTF-16(编码U+0000,“NUL”),它可能是两个字节的序列0x000x00


9
.NET 的 String 对象在内部除了存储字符串长度外,还包含一个空终止符。这使得它们可以直接被需要终止符的互操作函数使用。 - Jon Skeet
@Jon:我完全不知道,谢谢。如果我去查找“Chars”,我假设我找不到那个终止符? - Michael Petrotta
当然,我没有直接访问它的权限,ToCharArray 可以做任何它想做的事情,包括可能使用一些本地魔法。 - Michael Petrotta
1
看起来wcslen()必须至少找到两个0x00字节,因为字符'a'被UTF-16编码为0x6100。 - Ray
1
@Ray:没错,如果你的环境使用UTF-16编码,那就是这样。我的意思是,wcslen函数所使用的宽字符并没有定义长度。你可以自由地使用(虚构的)UTF-128编码,然后wcslen函数将会寻找一个由16个0x00字节组成的字符串。 - Michael Petrotta
显示剩余3条评论

5

7.24.4.6.1 The wcslen function (from the Standard)

...

   [#3]   The  wcslen  function  returns  the  number  of  wide
   characters that precede the terminating null wide character.

空宽字符是L'\0'

。在计算机科学中,空宽字符通常用作字符串的结尾标志。

wchar_t null = L'\0'; printf("null is %d bits\n", 8 * sizeof null); 这段代码打印出 null 是32位。 - tchrist
@tchrist:你应该使用CHAR_BIT而不是神奇的8。那个null与数组L"foo"中的每个(4)元素大小相同。 - pmg

4

没有任何字符串终止符号属于编码的一部分。

例如,如果您有字符串ab,它将使用以下字节序列在UTF-16中进行编码:61 00 62 00。如果您有大家,则会得到27-59-B6-5B。因此,可以看出没有预定的终止符号序列。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接