UTF-8编码的规则是什么?

时间:2019-02-15 03:00:52

标签: utf-8

我正在读UTF-8 Encoding,但我听不懂这句话:

  

对于等于或小于2047(十六进制0x07FF)的字符,使用UTF-8   表示分布在两个字节上。第一个字节将具有   两个高位被置位而第三位清零(即0xC2至0xDF)。的   第二个字节将设置高位,第二个位清零(即   0x80到0xBF)。

2047(0x07FF)确实由两个字节表示,最大值为0000 0111 1111 1111。

我看不到第一个字节两个高位设置和第三位清零之间的关系

这句话是什么意思?

2 个答案:

答案 0 :(得分:3)

把它当作一个容器,编码会保留一些位用于自己的同步,然后您就可以使用其余的位了。

因此,对于所涉及的范围,编码“模板”为

110 abcde  10 fghijk

(我在其中留下了一个空格来标记模板和我们要编码的代码点的值之间的边界,在实际字节之间留出两个空格) 您将使用11位abcdefghijk作为您实际要传输的值。

因此对于代码点U+07EB,您得到了

0x07   00000111
0xEB   11101011

屏蔽掉前五个零位(请记住,我们只得到11,因为编码在两个字节中可以容纳的最大值是0x07FF。如果值较大,则编码将使用其他模板,这是三个字节)等等

0x07 = _____ 111  (template: _____ abc)
0xEB = 11 101011  (template: de fghijk)

abc de = 111 11 (where the first three come from 0x07, and the next two from 0xEB)
fghijk = 101011 (the remaining bits from 0xEB)

产生价值

110 11111  10 101011

又名0xDF 0xAB。

Wikipedia's article on UTF-8包含了更多带有彩色数字的示例,以查看来自何处。

答案 1 :(得分:3)

您已经知道,2047(0x07FF)包含原始位

00000111 11111111

如果您查看UTF-8的位分配图:

image

您将看到0x07FF位于第二行,因此使用以下位模式将其编码为2个字节:

110xxxxx 10xxxxxx

将原始位替换为x,您将得到以下结果:

11011111 10111111 (0xDF 0xBF)

与您引用的描述完全相同:

  

第一个字节将设置两个高位,第三个字节被清除( 110 11111)。第二个字节将设置高位,第二个位将被清除( 10 111111)。