所以,我对Python3编码有问题。我有几个字节想要作为字符串工作。(说来话长)
用一句话来说,这是可行的
a = "\x85".encode()
print(a.decode())但这不是
b = (0x85).to_bytes(1,"big")
print(b.decode())UnicodeDecodeError: utf-8编解码器无法解码0位置的字节0x85 :无效的开始字节
我读过一些关于这个主题的文章,但是他们坚持说'python3坏了‘或者’你不应该使用字符串‘。大量关于堆栈溢出的文章只使用"work as“(如”使用替换错误“或”用户utc-16")。
有人能告诉我区别在哪里吗?为什么函数可以工作,而第二个函数不工作?他们俩的工作方式不应该一样吗?为什么在第二次尝试时utf-8不能解码字节?
发布于 2018-10-29 06:11:59
在第一种情况下,'\x85'.encode()在Python3默认编码UTF-8中编码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 bytePython 3绝对不是“坏的”。它干净地分离字节数据和文本。如果有原始字节,则将它们作为字节处理。Python 3中的原始数据旨在以字节字符串或字节数组的形式进行操作。Unicode字符串用于文本。将字节解码为文本以对其进行操作,然后将字节编码回字节以序列化为文件、套接字、数据库等。
如果出于某种原因,您认为需要使用Unicode字符串作为原始数据,那么Unicode的前256个代码点对应于1:1的latin1编解码器,其中一个对应于另一个。
>>> '\x85'.encode('latin1')
b'\x85'
>>> b'\x85'.decode('latin1')
'\x85'这通常用于纠正由于编码/解码错误而导致的编程错误。
https://stackoverflow.com/questions/53039144
复制相似问题