C UTF-16字符串终止符

C UTF-16字符串终止符,c,string,unicode,utf-16,unicode-string,C,String,Unicode,Utf 16,Unicode String,UTF-16字符串的字符串终止符序列是什么 编辑: 让我重新措辞这个问题,试图澄清一下。对wcslen()的调用如何工作?没有。字符串终止符不是编码的一部分 例如,如果您有字符串ab,它将以UTF-16编码,并具有以下字节序列:61 00 62 00。如果你有大家您将获得27-59-B6-5B。因此,正如您所看到的,没有预先确定的终止符序列。Unicode没有定义字符串终止符。你的环境或语言确实如此。例如,C字符串使用0x0作为字符串终止符,在.NET字符串中,string类中的单独值用于存储字

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

编辑:


让我重新措辞这个问题,试图澄清一下。对
wcslen()
的调用如何工作?

没有。字符串终止符不是编码的一部分


例如,如果您有字符串
ab
,它将以UTF-16编码,并具有以下字节序列:
61 00 62 00
。如果你有
大家您将获得
27-59-B6-5B
。因此,正如您所看到的,没有预先确定的终止符序列。

Unicode没有定义字符串终止符。你的环境或语言确实如此。例如,C字符串使用0x0作为字符串终止符,在.NET字符串中,
string
类中的单独值用于存储字符串的长度

要回答第二个问题,
wcslen
查找终止的
L'\0'
字符。它是任意长度的
0x00
字节,具体取决于编译器,但如果使用UTF-16(编码),则可能是两字节序列
0x00
0x00

7.24.4.6.1 wcslen功能(从)

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

空宽字符是
L'\0'

+1,不管它会解决“错误问题”类型的回答,我喜欢这种类型的问题,因为这正是谷歌和维基百科会告诉你的。可能是因为它太明显了。:-)顺便说一句,C不允许UTF-16作为
wchar\u t
的编码,这仅仅是因为它不适用于宽字符的C API,它假定每个多字节字符对应一个
wchar\u t
值,而不是一个
wchar\u t
值序列。如果你坚持让
wchar\u t
16位…在我使用过的每个系统上,
sizeof(wchar\u t)
==4个字节或32位,你就会被UCS-2或标准函数卡住,无法遵守标准的要求。我认为它不会起作用。微软Visual C++有 SigeOf(WCHARGETT)=2 < /COD>,这对程序员来说是一件烦人的事,需要编写支持Unicode的跨平台库。TravaI.NET.Code > String 对象的长度有一个长度和一个空终止符。这使它们可以直接被需要终止符的互操作函数使用。@Jon:不知道,谢谢。我想如果我去搜索
Chars
?…我当然不能直接访问它,
ToCharArray
可以做它想做的任何事情,包括可能的一些本机魔法。看来wcslen()至少必须找到两个0x00字节,因为字符“a”是UTF-16编码为0x6100。@Ray:这是真的,如果您的环境使用UTF-16。我的观点是,
wcslen
使用的宽字符没有定义的长度。您可以自由使用(一个虚构的)UTF-128,然后
wcslen
将查找16个
0x00
字节的字符串;printf(“null是%d位\n”,8*sizeof null)打印出空值为32位。@tchrist:您应该使用
CHAR\u-BIT
而不是magic 8。该
null
与数组
L“foo”
的(4)个元素的大小相同。