为什么在Python中将en-dash写成'\ xe2\x80\x93'?

kir*_*iri 5 python unicode encoding utf-8

具体来说,每次逃跑都\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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 18

您有UTF-8字节,这是一种编解码器,是将文本表示为计算机可读数据的标准.当编码到该编解码器时,U + 2013 EN-DASH代码点编码为这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标准的编解码器,但不是一回事.看到:

  • @ minerz029:UTF-8不是Unicode.它是*编解码器*,但可以处理所有Unicode标准.`\ xe2`只是一个字节.如果使用不同的编解码器对其进行解码,则会得到不同的Unicode结果.解码为ISO-8859-1(Latin-1)的`\ xe2`会给你U + 00E2代码点,或者`character`字符(带有抑扬符的小拉丁语). (3认同)