填一填python2.x 中文字符编码的坑

背景

python做为最优雅的语言之一一直倍受你们的青睐。它能够帮你从单调重复的工做解脱出来,好比统计各类蛋疼的数据,导入导出boss须要的表格等等。你要作的是编写、运行python脚本,而后喝个茶水等着运行结果就行了。html

这篇文章就是这样产生的----在我使用scrapy爬取数据的时候,遇到了python 2.x 中文字符编码的问题,之前对这个问题也是只知其一;不知其二,此次再次遇到说明要还债了,去搞清楚字符编码究竟是怎么一回事。python

预备知识

ASCII

首先,咱们须要明确在计算机中全部信息最终都是使用二进制表示的,每一个二进制位(bit)有0和1两种状态,8个二进制位被称为一个字节(byte),能够表示256种状态。数据库

做为计算机领域的先驱,美国在上世纪60年代制定了一套字符编码,使用二进制来表示英文字母、数字及一些符号,这套字符编码就是ASCIIjson

Unicode

随着计算机的发展,很快有了其余语言的编码需求,单字节的ASCII编码因为能表示的字符有限,已经不能知足需求了。为了避免与ASCII编码冲突,有能力的国家开始设计单独的编码----使用更多的字节表示字符,中国制定了gb2312数组

可是,随之而来的是字符编码方案数量增长带来的一系列问题。所以,Unicode应运而生。它把全部语言的字符都用同一种字符集来表示,解决了因不一样字符编码方案带来的一系列问题bash

而后来讲说Python 2.x 中文编码问题

先给你们来一个简单的🌰,比较常见scrapy

文件test.py内容:ui

#!/usr/bin/python
city = '京'
print city
复制代码

运行python test.py,结果如图:编码

那为何那? 若是你不知道,说明你没有仔细看预备知识。这是由于.py文件默认采用的是ASCII编码,中文字符不在它表示的范围内,报错

经过修改test.py默认编码方式解决spa

#!/usr/bin/python
# -*- coding: utf-8 -*-
city = '京'
print city
复制代码

看过了🌰,再来看看str和unicode

str和unicode都是basestring的子类。可是,严格来讲unicode是真正意义上的字符串,str是字节码----由unicode通过编码后的字节组成的序列。 上个截图,消除你们的疑惑,s == s2

经过这个🌰,理解str和unicode的区别,妈妈不再担忧处理中文字符时出现乱码或报错了(不管是unicode转str,仍是str转unicode),还要避免以下操做

  • 1.对中文的unicode进行decode,非法
  • 2.对中文的str进行encode,非法

说了这么多,show me you code (斜眼笑)🌰:

#!/usr/bin/python
# -*- coding: utf-8 -*-
u_z = u'京'
s_z = '京'
u=u'jing'
s='jing'

print u_z
print s_z
print repr(u_z)
print repr(s_z)

print '=================='

print u
print s
print repr(u)
print repr(s)

print '=================='

print u.decode()
print s.encode()

print u_z.decode()
print s_z.encode()
复制代码

一点建议

  • 同一工程下,统一源文件字符编码、统一系统字符编码,防止乱码
    #!/usr/bin/python
    # -*- coding:utf8 -*-
    import sys
    reload(sys)
    sys.setdefaultencoding("utf-8")
    复制代码
  • 尽可能使用unicode
  • 数组,字典存入数据库前,进行json.dumps
  • decode和encode格式统一

好了,这就是我对python2.x 中文字符编码的一些理解,但愿能够帮到你

未经本人容许,不得转载。文章有疏漏浅薄之处,请各位大神斧正

相关文章
相关标签/搜索