引言
刚接触Python的时候,第一印象就是开头的编码声明,如下:
#-*-coding:utf-8-*-
然后,当我的程序出现乱码的情况下怎么办?改编码类型,试一下gbk,试一下utf-8,但也不知道问题出在哪,有些不明觉厉。后面上网找了一下相关的资料,才有点明白这个编码声明到底起了什么作用,主要参考了下面两个网址:
http://www.jb51.net/article/26543.htm
http://www.ruanyifeng.com/blog/2007/10/ascii_unicode_and_utf-8.html
1、 编码声明的作用有以下三点:
a. 声明源文件中将出现非ascii编码,通常也就是中文;
新建一个Python工程时,默认是没有出现编码声明的,只有在程序中出现非ASCII码的情况下才需要进行编码声明,否则编译器会报出类似下面的错误:
SyntaxError:Non-ASCII character '\xc4' in file
首先,无论是英文、中文和特殊符号,在计算机内部都是以二进制的形式存储的,关键在于用什么二进制串表示某个具体的字符(即字符编码),其中最为熟悉的是ASCII编码,可以表示127个字符,而python编译器也默认将所有的字符当做ASCII编码,但是以中文字符“中”为例,如果采用GB2312编码其对应字符值为0xd6d0,而在ASCII编码中不可能出现0xd6或者0xd0的编码数据,因此编译器无法识别,这个时候编码声明的作用就是“告诉”编译器这一类非ASCII码字符的编码类型。
b. 在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式;
在某些高级IDE中,会自动将你的文件格式保存成你指定的编码格式,如果想查看文件格式可以用记事本打开然后另存为即可看到文件的编码类型。
c. 进行编码转换时采用的解码方式;
str= u"中文";
假设上述代码的“中文”采用gb2312编码,即为0xd6d0cec4,将其转换为Unicode编码经过以下两步操作:
str.decode('gb2312').encode('utf-8')
首先用gb2312进行解码,再重新编码为utf-8,关键就在于编译器本身并不知道字符“中文”的编码类型,它是根据编码声明的指定类型进行解码的,也就是说当实际的编码类型和编码声明不一致时,就会出现乱码,这也是出现乱码的根本原因。
2、 操作不同编码格式的文件乱码
#-*-coding:utf-8-*-
defline(filePath):
file = open(filePath,"r");
txt = file.read();
print txt;
file.close();
return;
line("e://1.txt");
将字符串“中文”分别以txt形式保存为ANSI编码,然后将其读入到内存中,输出的控制台的结果如下所示:
因为在调用print时会将编码转换成本地编码的形式输出,默认的本地编码为gb2312
print txt
等价于
print txt. decode(' utf-8').encode(' gb2312')
实际上“中文”采用的是gbk2312,它的编码类型和编码声明不一致,但是编译器会根据编码声明对字符串进行解码,因此出现乱码,如果将输出语句改为
printtxt. decode(' gb2312')
即可输出正确的中文字符。