关于unicode字符及其utf8二进制表示

时间:2017-06-19 03:53:27

标签: unicode

出于好奇,我想知道为什么例如代码点为322的字符“ł”在UTF8中的11000101:10000010二进制表示为197:130而不是十进制00000001:01000010中的实际二进制表示1:66

2 个答案:

答案 0 :(得分:2)

UTF-8以单字节编码U + 0000..U + 007F范围内的Unicode代码点。 U + 0080..U + 07FF范围内的代码点使用2个字节,U + 0800..U + FFFF范围内的代码点使用3个字节,代码点范围U + 10000..U + 10FFFF使用4个字节。

当代码点需要两个字节时,则第一个字节以位模式110开始;其余5位是Unicode代码点的高5位。连续字节以位模式10开始;其余6位是Unicode代码点的低位6位。

你正在寻找łU+ 0142 LATIN SMALL LETTER L WITH STROKE(小数322)。表示十六进制142的位模式是:

00000001 01000010

使用以冒号标记的UTF-8子字段分组,即:

00000:001 01:000010

所以UTF-8代码是:

110:00101 10:000010
11000101  10000010
0xC5      0x82
197       130

相同的基本思想适用于3字节和4字节编码 - 每个连续字节斩波6位,并将前导位与适当的标记位组合(1110表示3字节; 11110表示4字节 - 那里与完整字符中的字节一样多的前导1位。现在有很多其他规则对你来说并不重要。例如,你永远不会编码UTF-16高代理(U + D800..U + DBFF)或低代理(U + DC00..UDFFF)UTF-8(或UTF-32)。您永远不会编码非最小序列(因此尽管字节0xC0 0x80可用于编码U + 0000,但这是无效的)。这些规则的一个结果是字节0xC0和0xC1在UTF-8中永远不会有效(并且都不是0xF5..0xFF)。

答案 1 :(得分:1)

UTF8旨在与7位ASCII兼容。

为实现此目的,UTF8编码字节序列中最重要的字节位用于表示字节是否是多字节编码代码点的一部分。如果设置了MSB,则该字节是编码单个代码点的2个或更多字节序列的一部分。如果未设置MSB,则该字节对0..127范围内的代码点进行编码。

因此,在UTF8中,字节序列[1][66]分别代表两个代码点1和66,因为MSB未在任一字节中设置(= 0)。

此外,代码点#322 必须使用每个字节中设置了MSB(= 1)的字节序列进行编码。

UTF8 encoding are quite a bit more complex的确切细节,但有许多资源可用于这些细节。