如果我没记错的话,这意味着UTF-8需要两个字节代表2048个字符。换句话说,我们需要从2^16选项中选择2048个候选人来表示每个字符。
对于等于或低于2047(HEX 0x07FF)的字符,UTF-8 表示形式分布在两个字节上。在65,536中选择2048的大事是什么?但是,UTF-8明确将边界设置为每个字节。
在以下语句中,第一个字节的组合数为30(0xdf -0xc2 + 0x01),第二个字节的组合数为64(0xbf -0x80 + 0x01)。
第一个字节将有 两个高位设置和第三位清除(即0xc2至0xdf)。这 第二个字节将具有顶部钻头和第二位清除(即 0x80至0xbf)
1920年数字(64倍30)如何容纳2048组合?
您已经知道,2047年(0x07ff)包含原始位
00000111 11111111
的位分布图:如果您查看
UTF-8
110xxxxx 10xxxxxx
S,您将获得此结果:
11011111 10111111 (0xDF 0xBF)
完全按照您引用的描述说:
第一个字节将具有两个高位设置和第三位清除(
11011111)。第二个字节将具有顶部钻头集和第二位清除(
11
111111)。认为它是一个容器,在该容器中,编码为自己的同步提供了一些位,您可以使用剩余的位。
对于所讨论的范围,编码“模板”为
110 abcde 10 fghijk
(我留下了一个空间来标记我们要编码的代码点之间的边界和值之间的边界,以及实际字节之间的两个空间) 然后,您可以使用11个位
U+07EBabcdefghijk
用于实际要传输的值。 对于代码点
在何处将前五位零位掩盖(请记住,我们只能得到11个 - 因为编码可以在两个字节中容纳的最大值为0x07ff。如果您具有较大的值,则编码将使用其他模板,即三个字节)和So
so。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
aka0xdf0xab.
wikipedia在UTF-8上的文章包含更多颜色数字的示例,以查看来自哪里的内容。 可以用单个字节表示的范围0x00-0x7f包含128个代码点;因此,两个字节范围需要容纳1920 = 2048-128代码点。
原始编码将允许在第一个字节中的0xc0-0xbf范围内的值,但是不需要值0xc0和0xc1的值,因为这些值将代表可以在单个字节中表示的代码点,因此根据编码规格而无效。换句话说,0xc2中的0x02源于以下事实:在11个段中,至少在11个段中至少有一个位置可以代表的(其中一个)需要一个位,以使值需要两个字节。