首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python3,使用ctf-8编码/解码的问题(在某些情况下)

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

Stack Overflow用户
提问于 2018-10-29 05:18:05
回答 1查看 674关注 0票数 0

所以,我对Python3编码有问题。我有几个字节想要作为字符串工作。(说来话长)

用一句话来说,这是可行的

代码语言:javascript
复制
a = "\x85".encode()
print(a.decode())

但这不是

代码语言:javascript
复制
b = (0x85).to_bytes(1,"big")
print(b.decode())

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

我读过一些关于这个主题的文章,但是他们坚持说'python3坏了‘或者’你不应该使用字符串‘。大量关于堆栈溢出的文章只使用"work as“(如”使用替换错误“或”用户utc-16")。

有人能告诉我区别在哪里吗?为什么函数可以工作,而第二个函数不工作?他们俩的工作方式不应该一样吗?为什么在第二次尝试时utf-8不能解码字节?

EN

回答 1

Stack Overflow用户

发布于 2018-10-29 06:11:59

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

代码语言:javascript
复制
>>> '\x85'.encode()
b'\xc2\x85'

然后解码工作,因为它是正确的编码在UTF-8开始时:

代码语言:javascript
复制
>>> b'\xc2\x85'.decode()
'\x85'

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

代码语言:javascript
复制
>>> (0x85).to_bytes(1,'big')
b'\x85'

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

代码语言:javascript
复制
>>> 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个代码点对应于1:1的latin1编解码器,其中一个对应于另一个。

代码语言:javascript
复制
>>> '\x85'.encode('latin1')
b'\x85'
>>> b'\x85'.decode('latin1')
'\x85'

这通常用于纠正由于编码/解码错误而导致的编程错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53039144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档