具体来说,\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
答案 0 :(得分:16)
您有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标准的编解码器,但不是一回事。参见: