今天是学习python的第一天,和其他所有语言一样,我首先就编码问题对python的字符串操作进行学习,很不幸,刚开始就遇到了问题;
首先,在ubuntu下,用vi新建一个a.py,输入以下代码:
s = '中文';
print s;
保存后,运行python a.py,出现了以下错误:
SyntaxError: Non-ASCII character '\xe4' in file b.py on line 2, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
ok,我们可以看到,python很明显地提示我说,没有设置编码,那么好,我们就为它设置以下编码,要处理中文,我们立马就该想到用GBK、gb2312或者Unicode,好,先用GBK试一下(gb2312就不用试了,毕竟与GBK是兼容的),修改a.py文件内容:
#coding=gbk
s = '中文';
print s;
保存后,再次运行,很悲剧,又有错误:
SyntaxError: 'gbk' codec can't decode bytes in position 7-8: illegal multibyte sequence
这是什么个情况?我再用unicode试一试,为了兼容ansi,我采用了utf-8,修改a.py文件内容如下:
#coding=utf-8
s = '中文‘;
print s;
保存后,再次运行,额,神奇,搞定了,正确输出了“中文”两个汉字。
这是为什么呢?查看一下a.py的文件保存格式:
:set fileencodoing
输出了 fileencoding=utf-8,可以看到a.py在我的ubuntu上默认是以utf-8格式来保存的,想以gbk的编码来解释,当然行不通。
起初还以为是vi在以utf-8格式保存文件时,会在文件头插入BOM,但是经过以下测试,发现不是这个问题:
#coding=gbk
import codecs;
data=open('b.py').read();
print len(data);
if data[:3] == codecs.BOM_UTF8:
data=data[3:];
print len(data);
输出的长度都是36,说明没有BOM字节,不过在windows的某些软件就难说了,比如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。
因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:
# coding=gbk
import codecs;
data = open("a.py").read();
if data[:3] == codecs.BOM_UTF8:
data = data[3:];
print data.decode("utf-8");