python编码问题记录

2021-01-20 11:13

阅读:571

这类问题一般出现在python2中,在编码类型转换中触发。

python2中有两个编解码函数: decodeencode,用于unicode编码和其他编码方式的转换。 decode将其他编码类型的字符串,转化为unicode编码,反之, encode将unicode编码转换为其他. 我们可以通过这两个函数,获取某种编码下的变量值,如:

>>> import chardet
>>> a = ‘张三‘  
>>> chardet.detect(a)
{‘confidence‘: 0.7525, ‘language‘: ‘‘, ‘encoding‘: ‘utf-8‘}    # 系统默认编码为utf-8, 所以a的编码为utf-8
>>> b = a.decode(‘utf-8‘)     # 用utf-8 解码后,得到unicode字符串
>>> b
u‘\u5f20\u4e09‘
>>> c = b.encode(‘gb2312‘)    # 将unicode 编码为gbk
>>> chardet.detect(c)
{‘confidence‘: 0.682639754276994, ‘language‘: ‘Russian‘, ‘encoding‘: ‘KOI8-R‘}

>>> chardet.detect(a.decode(‘utf-8‘).encode(‘gb2312‘))   # 一次性变更有同样的效果
{‘confidence‘: 0.682639754276994, ‘language‘: ‘Russian‘, ‘encoding‘: ‘KOI8-R‘}

但是,当由于某种原因,我们无意将一种非unicode编码,转换为另一种非unicode编码,且未指定解码方式时,可能出现上述error,如

>>> a.encode(‘gb2312‘)   # a是utf-8编码,强行转换成gb2312,会出错
Traceback (most recent call last):
File "", line 1, in 
UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xe5 in position 0: ordinal not in range(128)

这是因为,如果a不是unicode编码,且要转换成另外一种编码的情况下,python会用默认的解释器编码先进行解码,即进行a.decode(‘ascii‘)的操作,但是由于a中包含中文,ascii无法解析,故报错


评论


亲,登录后才可以留言!