首先这些问题只有在python2.X版本出现,因为3.X版本中python环境就只有unicode类型的字符串了,即所有程序中处理的都会自动转换成unicode字符串。那么2.X的python程序开发中如何避免和理清编码问题呢?首先要保持一个良好的统一规则,不然一切都是白扯了,统一都用utf-8是最好的。
python中会用到编码的不同地方有:
1、python源文件的编码
2、python运行时环境的编码
3、python程序接收的外部输入字符串的编码
首先,源文件中的编码就是对文件中非英文字符的编码和保存方式,默认是用操作系统的默认编码;这个编码是由系统的locale决定的【通过systeminfo.exe可以查到】,如:locale设置为zh-CN,那么其默认编码就是ASCII码【locale.getdefaultlocale()】,所以此时源文件中有非英文字符时就会编码报错,解决办法是在源码文件头部加一行编码指定,如:# -*- coding: utf-8 -*-,这样就是指定了源文件中非英文字符的编码方式。
其次,运行时环境的编码,通过python在运行时首先获取系统locale的信息【locale.getdefaultlocale()】,如:zh-CN的默认编码是ASCII码,对于英文字符解码都正常,当遇到多字节文字,就会用文件系统的默认编码【sys.getdefaultencoding()】,zh-CN时是GBK。这就是我们通常在windows系统的命令行环境中启动python的效果,所有输入的字符串都是str类型,英文的是ascii类型,中文的则是gbk类型。同样在python中有一个unicode函数,其在解码字符串时使用的就是前面所说的一套逻辑。再来说说如何在python环境中设置编码,首先直接设置unicode字符,比如:u'中文',这样就是直接把一个字符串转换成unicode字符串,任何编码环境下输入这样的字符串其都会相应的被解码成unicode字符串;还有就是设置python运行环境编码【sys.getdefaultencoding()】,zh-CN中默认是GBK,不过我们可以修改它,这样python环境中默认的解码方式都会使用这个设置的编码,如:
import sys
reload(sys)# Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入
sys.setdefaultencoding('utf-8')
再次,外部输入的编码,比如读取文件;内置的open()方法打开文件时,read()读取的是str,读取后需要使用正确的编码格式进行decode()。 write()写入时,如果参数是unicode,则需要使用你希望写入的编码进行encode(),如果是其他编码格式的str,则需要先用该str的编码进行decode(),转成unicode后再使用写入的编码进行encode()。如果直接将unicode作为参数传入write()方法,Python将先使用源代码文件声明的字符编码进行编码然后写入。
总结,基本上这3个环节上都使用了统一的编码,那自然就没有什么大问题,而上面的3个环节中前2个我们可以控制,第三个是和使用者有关的,不可确定但是我们可以在接收用户或者外部输入时就对其进行编码识别,并在接收字符的同时第一时间就将其解码为unicode,这样就可以尽量减少编码问题的出现了。
if s.decode('utf-8', REPLACE)==s.decode('utf-8', IGNORE):
s = s.decode('utf-8')
elseif ....
....