UTF-16字符串的字符串终止序列是什么?
编辑:
我重新解释一下问题,以便澄清。调用 wcslen()
的工作原理是怎样的?
UTF-16字符串的字符串终止序列是什么?
编辑:
我重新解释一下问题,以便澄清。调用 wcslen()
的工作原理是怎样的?
Unicode不定义字符串终止符,这取决于您的环境或语言。例如,C字符串使用0x0作为字符串终止符,而在.NET字符串中,String
类中使用一个单独的值来存储字符串的长度。
至于您的第二个问题,wcslen
寻找终止的L'\0'
字符。根据我所看到的,这个字符的长度取决于编译器,但如果您使用UTF-16(编码U+0000,“NUL”),它可能是两个字节的序列0x00
0x00
。
String
对象在内部除了存储字符串长度外,还包含一个空终止符。这使得它们可以直接被需要终止符的互操作函数使用。 - Jon SkeetToCharArray
可以做任何它想做的事情,包括可能使用一些本地魔法。 - Michael Petrottawcslen
函数所使用的宽字符并没有定义长度。你可以自由地使用(虚构的)UTF-128编码,然后wcslen
函数将会寻找一个由16个0x00
字节组成的字符串。 - Michael Petrotta7.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'
CHAR_BIT
而不是神奇的8。那个null
与数组L"foo"
中的每个(4)元素大小相同。 - pmg没有任何字符串终止符号属于编码的一部分。
例如,如果您有字符串ab
,它将使用以下字节序列在UTF-16中进行编码:61 00 62 00
。如果您有大家
,则会得到27-59-B6-5B
。因此,可以看出没有预定的终止符号序列。
wchar_t
的编码方式,这是因为它与 C 宽字符 API 不兼容,该 API 假定每个多字节字符对应于一个 单独的wchar_t
值,而不是一系列的wchar_t
值。如果你坚持要将wchar_t
设为 16 位,那么你只能使用 UCS-2 或者不符合标准要求的标准函数。 - R.. GitHub STOP HELPING ICEsizeof(wchar_t)
都等于4个字节或32位。否则我认为它不会起作用。 - tchristsizeof(wchar_t) == 2
, 这让需要编写支持Unicode跨平台库的程序员感到非常恼火。 - dan04