我们在用python处理中文的时候,或多或少会遇到这样一些错误
常见错误1:
SyntaxError: Non-ASCII character 'xe4' in file C
常见错误2:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
毫无疑问,我们在用python2.7.x的时候都会遇到这种问题,我们常规的解法又是怎么样的呢
# coding:utf-8 import requests def print_text(): url = 'http://www.cnblogs.com/' print requests.get(url).text.encode('utf-8') print_text()
首先在文件py文件的头部加上标识coding:utf-8 ,然后使用encode('utf-8'),一般这样处理,文字都可以正常显示到我们的控制台了。那有没有想过我们为什么要这样做?如果你不仅是对写code感兴趣,更想了解其中的原因的话,那我们接着往下看
说起字符的编码与解码,那就不得不提字符集了
如图所示,我们所知的英文编码都是采用ansi编码,随着中国的崛起,国家也开始信息化,但是计算机不认识中国汉字,怎么办呢,我们制定自己统一的字符集,这就是GB2312,
后来更新的字符集,GBK,GB18030,BIG5 ,都是在原来的基础之上增加一些新的元素的识别,比如一些生僻字,繁体字认识。
这样一来不是中文一套,英文一套,那后来的一些其它的国家文字不就都不能互相通用了,那干脆一锅端,将这些英文,中文,各国的语言文字大一统,Unicode就出现了,不仅兼容了这些文字,与方便了各国的信息交流.
在Unicode编码方式下,又存在 utf-8,utf-16,utf-32的编码方式
通过上面的一些例子,我们可以大致对于编码和解码有一个大概的印象,那接下来我们看看python2.7.x对于编码是怎么处理的,还是先上一个图
basestring下面有两个对象,unicode,str 那这两者的关系是怎么样的?
unicode ==encode==> str
str ==decode==> unicode
我们先看python的输出
# coding:utf-8 s = '中文' print type(s)
输出:
<type 'str'>
在看看decode之后的处理方式
# coding:utf-8 s = '中文'.decode('utf-8') print type(s)
输出:
<type 'unicode'>
这样实验我们可以很直观的感受到,当我们要输出一个中文的时候:我们输出的是一个经过unicode原始对象encode后的str,那当我们拿到一个返回对象,最常见的在爬虫里面得到返回字符串的时候我们怎么处理呢?
首先我们要在py文件头部声明处理编码,因为我们的py文件默认采用的是ascii编码,当返回的字符串写回到文档时就与文档编码相冲突,这里就会报销:
#coding:utf-8
一般我们加上coding:utf-8就够了,或者coding:gbk也可以
然后对于返回对象我们可以查看一下类型type(response.text)
如果是unicode ,那这response.text.encode('utf-8')就可以得到我们要的str对象,如果是str,我们可以直接print出来,或者先解码,在按你需要的方式编码.
参考文章: