Python 2.X 在输入汉字和特殊字符的时候,经常遇到编码解码的问题,究其原因,编译器默认将文件当做ascii编码,因此要正确的实现编解码的转换,需要进行一些设置。
首先让我们来了解几个概念。
文件编码、字符串编码、系统编码代码中字符串的默认编码与代码文件本身的编码一致。
举个例子,如果是在utf8的文件中,那么字符串就是utf8编码;如果是在gb2312的文件中,则其编码为gb2312。 但是,如果指明了字符串为unicode字符串,那么就是unicode编码。
代码文件的默认编码与系统编码一致,因此如果不指定文件的编码,那么默认的编码格式就是系统编码。 那么如何查看系统编码?
env |grep -i lang
或者,在交互式python命令行下,执行如下命令:
import sys
sys.getdefaultencoding()
输出一般都是ascii,系统编码一般是utf8,所以需要先把二者统一。
在python文件开头加上# –– coding: utf-8 –– 来识别中文并能够把中文正确的转换为unicode。
方法2修改python的默认系统编码
>>> import sys,locale
>>> sys.getdefaultencoding()
'ascii'
>>> sys.setdefaultencoding() #这里会报错,找不到setdefaultencoding()函数
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys) #需要reload。
<module 'sys' (built-in)>
>>> locale.getdefaultlocale()
('zh_CN', 'UTF-8')
>>> sys.setdefaultencoding("UTF-8") #把编码与操作系统统一起来
>>> sys.getdefaultencoding()
'UTF-8'
之所以要reload(sys),因为python环境在初始化的时候要执行site.py这个文件,而为了防止用户修改python的默认编码,在site.py文件中会把setdefaultencoding()函数del 掉,因此我们必须通过reload(sys)把这个函数找回来。 有兴趣的不妨自己试一下:
先rpm -qa|grep python26 找到python的包
然后rpm -q -l python26-2.6.8-1.el5|grep site.py 找到site.py文件的位置
我的机器上是:/usr/lib64/python2.6/site.py
vi打开,main函数里面,有一段:
重新reload一下sys,把setdefaultencoding函数给找回来。再setdefaultencoding就对了。
编码与解码环境设置正确后,就可以进行编码转换了。python中的编码转换用decode和encode来实现,unicode编码可以认为是各种编码之间转换的桥梁。
decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode(‘gb2312’),表示将gb2312编码的字符串str1转换成unicode编码,因此,如果str1本身不是gb2312编码,就会报错。
encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode(‘gb2312’),表示将unicode编码的字符串str2转换成gb2312编码,因此,需要str2本身的编码是unicode。
总结一下,
u.encode(‘…’)基本上总是能成功的,只要你填写了正确的目标编码。这就像任何文件都可以压缩成zip文件,是一个道理。
s.decode(‘…’)经常会出错,因为s是什么“编码”取决于上下文,当你解码的时候需要确保s是用什编码。就像打开zip文件的时候,你要确保它确实是zip文件,而不仅仅是伪造了扩展名的zip文件。
Python3中,已经默认采用utf8编码了。
《Python核心编程 第二版》.(Wesley J. Chun ).[高清PDF中文版]
《Python开发技术详解》.( 周伟,宗杰).[高清PDF扫描版+随书视频+代码]
Python脚本获取Linux系统信息
在Ubuntu下用Python搭建桌面算法交易研究环境