\ x和unicode代码点之间的关系

时间:2019-04-17 23:09:13

标签: python unicode utf-8 hex escaping

在Python(2或3)中,评估b'\xe2\x80\x8f'.decode("utf-8")

产生\u200f,类似地'\u200f'.encode("utf-8")产生b'\xe2\x80\x8f'

第一个看起来像一个由三个2个字符的十六进制值组成的链,它们分别等于十进制226、128和143。第二个看起来像一个单一的十六进制值,等于十进制8207。

'\ xe2 \ x80 \ x8f'和'\ u200f'之间是否存在逻辑关系?我会错误地解释这些值吗?

我可以看到值在这样的表中以某种方式链接:https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128&utf8=string-literal

但是为什么这两个值在同一行上?

2 个答案:

答案 0 :(得分:0)

差异与每个字符在utf-8中表示的位/字节数有关。

  

对于等于或小于127(十六进制0x7F)的任何字符,使用UTF-8   表示形式是一个字节。它只是全部的最低7位   unicode值。这也与ASCII值相同。

     

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

有关此here的更多信息。

如果您想了解有关Python如何使用这些值的更多信息,请check out here

答案 1 :(得分:0)

是的,第一个是“由三个2个字符组成的十六进制值的链,它们等于十进制226、128和143。”这是一个字节字符串。您得到了一个字节字符串,因为encode就是这样做的。您将其传递为UTF-8,因此字节是输入字符串的UTF-8编码。

“第二个看起来像一个十六进制值,等于十进制8207。”有点;这是文字字符串内的UTF-16代码单元的表示法。一个或两个UTF-16代码单元编码一个Unicode代码点。在这种情况下,仅一个用于对应的代码点。

当然,您可以将十六进制转换为十进制,但这在两种情况下都不是很普遍或有用。代码单位是特定的位模式。字节是作为整数的位模式,序列化为字节序列。

Unicode码点范围需要21位。 UTF-16以一个或两个16位代码单元编码一个代码点(因此,每个代码单元以字节顺序排列两个字节)。 UTF-8以一个,两个,三个或四个8位代码单元编码一个代码点。 (一个8位整数是一个字节,因此字节顺序是没有意义的。)每个字符编码都有一个单独的算法,可以将21位分配为所需的字节数。两者都是可逆的,并且完全支持Unicode字符集。因此,您可以直接将一个转换为另一个。

您引用的表未显示UTF-16。它显示Unicode代码点十六进制表示法:U + 200F。该符号供人类识别代码点。碰巧的是,当UTF-16以一个代码单位编码一个代码点时,其编号与该代码点的编号相同。