UTF-16可以是两字节字符集,也可以是四字节字符集。
据我所知,四字节字符集由高(16)和低(16)的替代字符组成。
我知道UTF-8可以是一个、两个、三个、四个或最多七个字节。
但是,通过查看第一个八位字节中的比特,我们可以很容易地判断UTF-8中有多少字节。
我想知道我们如何识别来自UTF-16和UTF-32的字节大小。
我将感谢您的帮助,并欢迎您对Unicode发表意见。
UTF-8
根据代码点的值,每个代码点使用1、2、3或4个字节(RFC 3629不允许5个以上字节的变化,以保持与UTF-16的兼容性,因为它们可以编码高于UTF-16的最大代码点U+10FFFF的代码点)。分析第一个字节的高位将告诉您序列中总共有多少字节,包括第一个字节:
-
如果高位为0,则字节的数值就是代码点的值。
-
如果高2位是1并且高3位是0,则码点值跨越2个字节。下一个字节的高位必须设置为1,高位第2位必须设置为0,否则序列格式不正确。
-
如果高3位是1并且高4位是0,则码点值跨越3个字节。接下来的2个字节必须将其高位设置为1,将其高位第2位设置为0,否则序列格式不正确。
-
如果高4位是1并且高5位是0,则码点值跨越4个字节。接下来的3个字节必须将其高位设置为1,将其高位第2位设置为0,否则序列格式不正确。
-
如果5个或更多的高位被设置为1,则该序列是错误的。
UTF-16
根据代码点的值,每个代码点使用2或4字节。分析前两个字节的数值(将大/小端序考虑在内)将告诉您序列中总共有多少字节,包括前2个字节。
-
如果数值在0x0000.0xD7FF或0xE000.0xFFFF的范围内,则为代码点值。
-
如果数值在0xD800.0xDBFF的范围内,则代码点值跨越4个字节。前2个字节是高代理项。对于低代理项,接下来2个字节的数值必须在0xDC00.0xDFFF的范围内,否则序列格式不正确。
-
如果数值在0xDC00.0xDFFF的范围内,则序列格式不正确。
UTF-32
这总是每个代码点4个字节。4个字节的数值(考虑到大小端序)是代码点值。