【问题标题】:Why is the en-dash written as '\xe2\x80\x93' in Python?为什么破折号在 Python 中写成 '\xe2\x80\x93'?
【发布时间】:2015-04-30 12:47:42
【问题描述】:

具体来说,\xe2\x80\x93 中的每个转义符是做什么的,为什么需要 3 个转义符?尝试自行解码会导致“数据意外结束”错误。

>>> print(b'\xe2\x80\x93'.decode('utf-8'))
–
>>> print(b'\xe2'.decode('utf-8'))
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 0: unexpected end of data

【问题讨论】:

    标签: python unicode encoding utf-8


    【解决方案1】:

    您有UTF-8 bytes,它是一个编解码器,一种将文本表示为计算机可读数据的标准。 U+2013 EN-DASH codepoint 在编码到该编解码器时会编码为这 3 个字节。

    尝试仅解码 UTF-8 这样的一个字节是行不通的,因为在 UTF-8 标准中,一个字节本身并不具有意义。在 UTF-8 编码方案中,\xe2 字节用于 Unicode 标准中 U+2000 和 U+2FFF 之间的所有代码点(它们都将使用额外的 2 个字节进行编码);总共有 4095 个代码点。

    Python 表示 bytes 对象中的值,您可以通过将其复制回 Python 脚本或终端来重现该值。任何不可打印的 ASCII 然后由 \xhh 十六进制转义表示。这两个字符组成字节的十六进制值,一个介于 0 和 255 之间的整数。

    十六进制是一种非常有用的表示字节的方法,因为您可以表示 2 对 4 字节,每对都用一个字符,一个 0 - F 范围内的数字。

    \xe2\x80\x93 则表示有三个字节,十六进制值分别为 E2、80 和 93,或十进制分别为 226、128 和 147。 UTF-8 标准告诉解码器获取第一个字节的最后 4 位,以及第二个和第三个字节中每个字节的最后 6 个字节(其余位用于指示您正在处理哪种类型的字节以防出错处理)。那些 4 + 6 + 6 == 16 位然后编码十六进制值 2013(0010 000000 010011 二进制)。

    您可能想了解编解码器(编码)和 Unicode 之间的区别; UTF-8 是一种可以处理所有 Unicode 标准的编解码器,但不是一回事。见:

    【讨论】:

    • 感谢您的回答。你能澄清一下\xe2转义在Unicode中的具体目的是什么吗?有什么暗示吗?
    • @minerz029:UTF-8 不是 Unicode。它是一种编解码器,但可以处理所有的Unicode 标准。 \xe2 只是一个字节。如果您使用不同的编解码器对其进行解码,那么您会得到不同的 Unicode 结果。 \xe2 解码为 ISO-8859-1 (Latin-1) 会给你 U+00E2 代码点,或 â 字符(带抑扬符的小拉丁字母)。
    • @minerz029:套用 Martijn,\xe2 是一个本身没有太多意义的字节,它是代码点 U+2000 之间某些 UTF8 编码字符的前 (4+)4 位和 U+2FFF
    猜你喜欢
    • 1970-01-01
    • 2018-11-04
    • 1970-01-01
    • 1970-01-01
    • 2011-04-03
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多