如何知道UTF-16发送给您的字节数



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的代码点)。分析第一个字节的高位将告诉您序列中总共有多少字节,包括第一个字节:

  1. 如果高位为0,则字节的数值就是代码点的值。

  2. 如果高2位是1并且高3位是0,则码点值跨越2个字节。下一个字节的高位必须设置为1,高位第2位必须设置为0,否则序列格式不正确。

  3. 如果高3位是1并且高4位是0,则码点值跨越3个字节。接下来的2个字节必须将其高位设置为1,将其高位第2位设置为0,否则序列格式不正确。

  4. 如果高4位是1并且高5位是0,则码点值跨越4个字节。接下来的3个字节必须将其高位设置为1,将其高位第2位设置为0,否则序列格式不正确。

  5. 如果5个或更多的高位被设置为1,则该序列是错误的。


UTF-16

根据代码点的值,每个代码点使用2或4字节。分析前两个字节的数值(将大/小端序考虑在内)将告诉您序列中总共有多少字节,包括前2个字节。

  1. 如果数值在0x0000.0xD7FF或0xE000.0xFFFF的范围内,则为代码点值。

  2. 如果数值在0xD800.0xDBFF的范围内,则代码点值跨越4个字节。前2个字节是高代理项。对于低代理项,接下来2个字节的数值必须在0xDC00.0xDFFF的范围内,否则序列格式不正确。

  3. 如果数值在0xDC00.0xDFFF的范围内,则序列格式不正确。


UTF-32

这总是每个代码点4个字节。4个字节的数值(考虑到大小端序)是代码点值。

最新更新