python编码遇过的问题

参照:http://wklken.me/posts/2013/08/31/python-extra-coding-intro.html

曾经出现过这样的问题

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)是因为对str进行编码
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)是因为对Unicode进行解码
上面两个都会出错
来看看判断是否为unicode/str的方法
>>> isinstance(u'中文', unicode)
True
>>> isinstance('中文', unicode)
False

>>> isinstance('中文', str)
True
>>> isinstance(u'中文', str)
False
总之不要对str使用encode,不要对unicode使用decode

一般在开头写上# -*- coding: utf-8 -*-之类的,都会统一源文件要保存的编码,然后在代码里,其他在源代码用作处理的硬编码字符串,统一用unicode,即用u'中文',而不是'中文',这样在代码里面除了外部来的东西里面的就都是Unicode和utf-8了,先获得系统的默认编码,然后再编码,这样就不会乱码了

chardef包可以检测一个文件是用什么编码的
>>> import chardet
>>> f = open('test.txt','r')
>>> result = chardet.detect(f.read())
>>> result
{'confidence': 0.99, 'encoding': 'utf-8'}


UnicodeDecodeError: 'gbk' codec can't decode bytes in position 32-33: illegal multibyte sequence错误
Unicode的解码(Decode)出现错误(Error)
接着看
'gbk' codec can't decode bytes in position 32-33,在23至33行出现了错误,原因是gbk不能被解码
因此猜测,是打算以gbk编码方式去解码让字符串变成Unicode,但是这里不能解码,illegal multibyte sequence就是无法解码,
总结:将一个字符串,通过gbk的方式,去解码,想要获得Unicode字符串,结果出错了
此种错误,原因是: 
要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码 
比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出

解决办法:

如果你确定当前字符串,比如抓取网页通过charset=utf-8,已经确定html的字符串是utf-8的,

则可以直接去通过utf-8去解码。

 
原文地址:https://www.cnblogs.com/thouger/p/5070653.html