C UTF-16字符串终止符
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类中的单独值用于存储字
让我重新措辞这个问题,试图澄清一下。对
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)个元素的大小相同。