我们在用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)

输出:

'str'>

在看看decode之后的处理方式

# coding:utf-8
s = '中文'.decode('utf-8')
print type(s)

输出:

'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出来,或者先解码,在按你需要的方式编码.

参考文章:

中文编码杂谈

python进阶-编码处理小结