在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
但是为什么这两个值在同一行上?
答案 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以一个代码单位编码一个代码点时,其编号与该代码点的编号相同。