Python3,使用ctf-8编码/解码的问题(在某些情况下)

时间:2018-10-29 05:18:05

标签: python python-3.x unicode codec

因此,我在使用Python3编码时遇到了问题。我有几个字节想用作字符串。 (长话短说)

简而言之,这行得通

a = "\x85".encode()
print(a.decode())

但这不是

b = (0x85).to_bytes(1,"big")
print(b.decode())
  

UnicodeDecodeError:utf-8编解码器无法解码位置0的字节0x85:   起始字节无效

我已经阅读了一些有关该主题的文章,但他们坚持认为“ python3已损坏”或“您不应为此使用字符串”。关于Stackoverflow的大量文章仅使用“解决方法”(例如“在错误时使用替换”或“用户utc-16”)。

谁能告诉我区别在哪里,为什么该功能起作用而第二个功能不起作用?他们俩不应该都一样工作吗?为什么utf-8在第二次尝试时无法解码该字节?

1 个答案:

答案 0 :(得分:1)

在第一种情况下,'\x85'.encode()使用UTF-8的Python 3默认编码对Unicode代码点U + 0085进行编码。因此,输出是该代码点的正确的两字节UTF-8编码:

>>> '\x85'.encode()
b'\xc2\x85'

解码之所以有效,是因为它已以UTF-8正确编码,开头为:

>>> b'\xc2\x85'.decode()
'\x85'

第二种情况是创建单字节字符串的复杂方法:

>>> (0x85).to_bytes(1,'big')
b'\x85'

此字节字符串未正确编码为UTF-8,因此无法解码:

>>> b'\x85'.decode()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x85 in position 0: invalid start byte

Python 3绝对不会“损坏”。它将字节数据与文本干净地分开。  如果您有原始字节,请将它们作为字节使用。 Python 3中的原始数据旨在以字节字符串或字节数组进行操作。 Unicode字符串用于文本。将字节解码为文本以进行操作,然后再编码回字节以序列化为文件,套接字,数据库等。

如果由于某种原因您需要对原始数据使用Unicode字符串,则Unicode的前256个代码点对应于latin1编解码器,以将它们之间的1:1映射。

>>> '\x85'.encode('latin1')
b'\x85'
>>> b'\x85'.decode('latin1')
'\x85'

这通常用于纠正由于使用错误编码进行编码/解码而引起的编程错误。