UTF-8如何表示字符? 我正在阅读UTF-8编码,我不明白以下句子。 对于等于或低于2047(Hex 0x07ff)的字符,UTF-8 表示形式分布在两个字节上。第一个字节W ...

问题描述 投票:0回答:2
对于等于或低于2047(HEX 0x07FF)的字符,UTF-8 表示形式分布在两个字节上。第一个字节将有 两个高位设置和第三位清除(即0xc2至0xdf)。这 第二个字节将具有顶部钻头和第二位清除(即 0x80至0xbf)

如果我没记错的话,这意味着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
的位分布图:

utf-8
2个回答
4
投票

您会看到0x07ff属于第二行,因此使用此位模式编码为2个字节:
110xxxxx 10xxxxxx

提取原始位进入x

S,您将获得此结果:

11011111 10111111 (0xDF 0xBF) image 完全按照您引用的描述说:

第一个字节将具有两个高位设置和第三位清除(
110
11111)。第二个字节将具有顶部钻头集和第二位清除(

11

111111)。

认为它是一个容器,在该容器中,编码为自己的同步提供了一些位,您可以使用剩余的位。

对于所讨论的范围,编码“模板”为

110 abcde 10 fghijk

(我留下了一个空间来标记我们要编码的代码点之间的边界和值之间的边界,以及实际字节之间的两个空间) 然后,您可以使用11个位abcdefghijk用于实际要传输的值。 对于代码点

U+07EB

3
投票

在何处将前五位零位掩盖(请记住,我们只能得到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)

the youldield youth
110 11111  10 101011

aka0xdf0xab.

wikipedia在UTF-8
上的文章包含更多颜色数字的示例,以查看来自哪里的内容。

可以用单个字节表示的范围0x00-0x7f包含128个代码点;因此,两个字节范围需要容纳1920 = 2048-128代码点。

原始编码将允许在第一个字节中的0xc0-0xbf范围内的值,但是不需要值0xc0和0xc1的值,因为这些值将代表可以在单个字节中表示的代码点,因此根据编码规格而无效。换句话说,0xc2中的0x02源于以下事实:在11个段中,至少在11个段中至少有一个位置可以代表的(其中一个)需要一个位,以使值需要两个字节。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.