Unicode 长度(字节)不能被2整除的UTF-16字符串是否始终无效?

Unicode 长度(字节)不能被2整除的UTF-16字符串是否始终无效?,unicode,utf-16,Unicode,Utf 16,如果您有一个UTF-16字符串,其长度(字节)为例如21。立即说这个字符串中有无效的UTF-16安全吗?我不算在空终止符里。我只是在计算实际的文本数据。我的推理是,在UTF-16中,文本元素被编码为1或2个双字节序列。答案是是的,当然。正如你所说 UTF-16文本元素编码为1或2个双字节序列 两字节序列的一半总是无效的 但是要小心:你说你“不算在空终止符中”。但UTF-16中不能有单字节空终止符,因为单个0x00字节可以是有效UTF-16字节对的最低有效字节。例如,字符Ā称为“带宏的拉丁大写字母

如果您有一个UTF-16字符串,其长度(字节)为例如21。立即说这个字符串中有无效的UTF-16安全吗?我不算在空终止符里。我只是在计算实际的文本数据。我的推理是,在UTF-16中,文本元素被编码为1或2个双字节序列。

答案是是的,当然。正如你所说

UTF-16文本元素编码为1或2个双字节序列

两字节序列的一半总是无效的


但是要小心:你说你“不算在空终止符中”。但UTF-16中不能有单字节空终止符,因为单个
0x00
字节可以是有效UTF-16字节对的最低有效字节。例如,字符Ā称为“带宏的拉丁大写字母A”,是Unicode
U+0100
,即UTF-16LE(小端)中的字节序列
0x00 0x01
,或UTF-16BE(大端)中的
0x01 0x00

好,好。我只是想确定一下。关于空终止符的好观点。如果出于某种原因,您必须读取表示UTF-16的字节序列,并且您不知道要读取多少个文本元素,那么您必须继续扫描,直到找到两个相邻的零字节,而不仅仅是一个,这样您就不会过早地停止读取。或者,当将UTF-16传递给某个API,该API读取字符串直到null终止符,则必须在末尾包含两个零字节,这样它就不会走得太远,也不会读入一些垃圾或导致崩溃或其他不好的情况。“如果……您不知道要读取多少文本元素,则必须继续扫描,直到找到两个相邻的零字节。”-确保在适当的2字节倍数偏移量处查找2个相邻的空字节。您不希望将一个代码单元的尾随null和下一个代码单元的前导null误认为null终止符。你必须一次扫描2个字节,寻找一个完整的代码单元,它本身就是0。并确保它不是代理项对的一部分,因为这也表示序列的格式不正确。