EVE Light on Life

Python与编码

使用Python处理中文字符时经常出现解码编码错误提示,均是编码不统一问题。

对于字符串的处理流程一般是这样:读入字符串,对字符串进行加减操作,最后输出到文件或屏幕。

最易出错的是对字符串的加减操作,如连接两个字符串对象是不同编码的,Python就会报错。所以,最好的方法就是统一在程序中使用的编码。

Unicode

Python有一个内置类为unicode,它是basestring的子类,Python一般通过它处理字符串,保证所有的字符串处于同一编码,对unicode对象操作则不会出错。

如何将其他编码的字符串转成unicode对象?使用字符串对象的decode方法可以将字符串转成unicode对象,而使用unicode对象的encode可以将unicode对象转成字符串变量。例如已知字符串a是gbk编码,字符串b是utf-8编码,现需要将字符串a和字符串b连接成字符串c并输出到文件,编码utf-8。

方法一

c = a.decode('gbk') + b.decode('utf-8') #c是unicode对象

c = c.encode('utf-8') #c变成utf-8的字符串对象

f.write( c )

方法二

c = a.decode('gbk').encode('utf-8') + b

f.write ( c )

可以看到,解决编码的问题就是统一编码后再进行操作。

字符串变量

要统一编码我们需要知道处理的每个字符串是什么编码,然后才要做下一步的转换工作。

python的字符串类str也是basestring类的子类,生成字符串对象有两种途径,一是外部输入,二是程序源文件变量赋值。

对于源文件变量赋值,字符串的编码为源文件定义的编码,如未定义,python解析器会默认为ascii编码。

python还可以通过赋值方式生成unicode对象,与字符串对象连接时需要进行统一编码操作。

下面看例子。

#   -*- coding: utf-8 -*-

f = open("test.txt", "r") #test.txt文档内容是gbk编码的”广场”两个字

a = "中国" #a是utf-8编码的字符串

b = u"天安门" #b是unicode对象

c = f.readline() #c是gbk编码的字符串

f.close()

d = a.decode('utf-8') + b + c.decode('gbk')

fw = open("out.txt", "w")

fw.write( d.encode('utf-8') ) #写入out.txt的字符为utf-8编码

fw.close()