【问题标题】:relationship between \x and unicode codepoints\x 和 unicode 代码点之间的关系
【发布时间】:2019-09-08 06:22:51
【问题描述】:
【问题讨论】:
标签:
python
unicode
utf-8
hex
escaping
【解决方案1】:
差异与每个字符在 utf-8 中表示的位数/字节数有关。
对于任何等于或小于 127(十六进制 0x7F)的字符,UTF-8
表示是一个字节。它只是完整的最低 7 位
Unicode 值。这也和 ASCII 值一样。
对于等于或小于 2047(十六进制 0x07FF)的字符,UTF-8
表示分布在两个字节上。第一个字节将有
两个高位设置,第三位清除(即 0xC2 到 0xDF)。这
第二个字节将设置最高位并清除第二个位(即
0x80 到 0xBF)。
有更多关于这个here的信息。
如果您想了解更多有关 Python 如何使用这些值的信息,请check out here。
【解决方案2】:
是的,第一个是“三个 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 在一个代码单元中编码一个代码点时,它的编号与代码点的编号相同。