在Python(2或3)中,评估b'\xe2\x80\x8f'.decode("utf-8")
产量\u200f
,同样'\u200f'.encode("utf-8")
产量b'\xe2\x80\x8f'
。
第一个看起来像三个2字符十六进制值的链,它们将等于十进制226,128和143.第二个看起来像一个十六进制值,等于十进制8,207。
'\ xe2 \ x80 \ x8f'和'\ u200f'之间是否存在逻辑关系?我是否错误地解释了这些值?
我可以看到这些值在这样的表格中以某种方式链接:https://www.utf8-chartable.de/unicode-utf8-table.pl?start=8192&number=128&utf8=string-literal
但为什么这两个值在同一行?
差异与每个字符在utf-8中表示的位/字节数有关。
对于任何等于或低于127(十六进制0x7F)的字符,UTF-8表示是一个字节。它只是完整unicode值的最低7位。这也与ASCII值相同。
对于等于或低于2047(十六进制0x07FF)的字符,UTF-8表示分布在两个字节上。第一个字节将设置两个高位,第三个位清零(即0xC2至0xDF)。第二个字节将置位高位,第二个位置为清零(即0x80至0xBF)。
有关此here的更多信息。
如果您想了解有关Python如何使用这些值的更多信息,请访问check out here。
是的,第一个是“三个2字符十六进制值的链,等于十进制226,128和143。”这是一个字节字符串。你有一个字节串,因为这就是encode
所做的。您传递了UTF-8,因此字节是输入字符串的UTF-8编码。
“第二个看起来像一个十六进制值,等于十进制8,207。”有点;它是文字字符串中UTF-16代码单元的表示法。一个或两个UTF-16代码单元编码Unicode代码点。在这种情况下,只有一个用于相应的代码点。
当然,您可以将十六进制转换为十进制,但在任何一种情况下都不常见或有用。代码单元是特定的位模式。字节是作为整数的位模式,序列化为字节序列。
Unicode代码点范围需要21位。 UTF-16以一个或两个16位代码单元对代码点进行编码(因此每个代码单元的字节顺序为两个字节)。 UTF-8以一个,两个,三个或四个8位代码单元对代码点进行编码。 (8位整数是一个字节,因此字节顺序没有实际意义。)每个字符编码都有一个单独的算法,可以将21位分配到需要的字节数。两者都是可逆的,完全支持Unicode字符集。所以,你可以直接将一个转换为另一个。
您引用的表格不显示UTF-16。它显示Unicode代码点十六进制表示法:U + 200F。该符号用于识别代码点。碰巧的是,当UTF-16在一个代码单元中对代码点进行编码时,它的编号与代码点的编号相同。