python3的编码问题

Posted fj0716

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python3的编码问题相关的知识,希望对你有一定的参考价值。

Python3对文本(str)和二进制数据(bytes)作了更为清晰的区分。

文本默认是以Unicode编码(python2默认是ascii),由str类型表示,二进制数据则由bytes类型表示。

str=中文ENGLISH

str是文本类型,即str类型

>>> str.encode(utf-8)
b\xe4\xb8\xad\xe6\x96\x87ENGLISH
>>> str.encode(gb2312)
b\xd6\xd0\xce\xc4ENGLISH
>>> bytes(str,utf-8)
b\xe4\xb8\xad\xe6\x96\x87ENGLISH

bytes()函数同str.encode(),即把str类型编码为bytes类型

>>> b\xe4\xb8\xad\xe6\x96\x87ENGLISH.decode(utf-8)
中文ENGLISH

解码过程,即把bytes数据转化为str

>>> b\xe4\xb8\xad\xe6\x96\x87ENGLISH.encode(utf-8)
Traceback (most recent call last):
  File "<pyshell#42>", line 1, in <module>
    b\xe4\xb8\xad\xe6\x96\x87ENGLISH.encode(utf-8)
AttributeError: bytes object has no attribute encode

不能把bytes数据继续编码为bytes

>>> 中文ENGLISH.decode(utf-8)
Traceback (most recent call last):
  File "<pyshell#44>", line 1, in <module>
    中文ENGLISH.decode(utf-8)
AttributeError: str object has no attribute decode

也不能把str数据继续解码为str

即编码过程是从str到bytes,解码过程是从bytes到str。

>>> b\xe4\xb8\xad\xe6\x96\x87ENGLISH.decode(gb2312)
Traceback (most recent call last):
  File "<pyshell#45>", line 1, in <module>
    b\xe4\xb8\xad\xe6\x96\x87ENGLISH.decode(gb2312)
UnicodeDecodeError: gb2312 codec cant decode byte 0xad in position 2: illegal multibyte sequence

上面是把以utf-8编码的bytes以gb2312的方式解码,结果出错了,因为0xad没有对应的gb2312编码

如果想知道一串bytes码是以何种unicode编码方式编码的,该如何呢?这个其实是无法百分之百确定的,不然的话乱码就不会发生了。

第三方库chardet,使用函数detect可以“猜”出编码方式。

from chardet import detect
>>> detect(b\xe4\xb8\xad\xe6\x96\x87ENGLISH) {confidence: 0.7525, encoding: utf-8}

这里置信0.7525,可以简单理解为概率0.7525,这里只有两个中文字符,如果bytes足够长,那么置信肯定更高

>>> detect(b\xe6\x88\x91\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87\xe6\x88\x91\xe7\x9c\x9f\xe7\x9a\x84\xe6\x98\xaf\xe4\xb8\xad\xe6\x96\x87)
{confidence: 0.99, encoding: utf-8}

这里有10个中文字符,结果置信就是0.99了

 

以上是关于python3的编码问题的主要内容,如果未能解决你的问题,请参考以下文章

在python 3.6中处理自定义编码时遇到类型错误

学习笔记:python3,代码片段(2017)

markdown 打字稿...编码说明,提示,作弊,指南,代码片段和教程文章

python3中的编码问题

从 XML 声明片段获取 XML 编码:部分内容解析不支持 XmlDeclaration

对 python2 和 python3 使用相同的代码进行编码 + 加密 + 填充的问题