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

时间:2015-12-23 01:35:54

标签: unicode encoding utf-16 utf-32

Hello堆栈溢出社区。

UTF-16可以是两个字节的字符集或四个字节的字符集。

据我所知,四字节字符集由高(16)和低(16)的代理组成。

我知道UTF-8可以是一个,两个,三个,四个或最多七个字节。

但是我们可以通过查看第一个八位字节中的位来轻松判断UTF-8有多少字节。

我想知道我们如何识别来自UTF-16加上UTF-32的字节大小。

非常感谢您对Unicode的帮助和欢迎。

感谢。

Dongseop

1 个答案:

答案 0 :(得分:1)

UTF-8

每个代码点使用 1,2,3或4个字节,具体取决于代码点的值(RFC 3629不允许5+字节变化,以保持与UTF的兼容性 - 16,因为他们可以编码高于UTF-16的最大码点U + 10FFFF的码点。分析第一个字节的高位将告诉您序列中有多少总字节数,包括第一个字节:

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

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

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

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

  5. 如果5个或更多高位设置为1,则序列格式不正确。

  6. UTF-16

    每个代码点使用 2或4个字节,具体取决于代码点的值。分析前2个字节的数值(考虑大/小端)将告诉您序列中有多少总字节数,包括前2个字节。

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

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

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

    4. UTF-32

      每个代码点始终 4个字节。 4个字节的数值(考虑大/小端)是代码点值。