转自:http://hi.baidu.com/daping_zhang/blog/item/09dda71ea9d7d21f4134173e.html
我曾经在深入浅出java中文问题 系列中研究过java的中文问题,现在中文问题已经不再羁绊我在java世界中漫游的脚步了。最近,对Python产生了浓厚的兴趣,谁知道跟中文问题这个老朋友又一次不期而遇。看来,在代码世界中,中文问题会在很长一段时间里跟我们形影不离。这也难怪,谁让当初发明计算机的不是我们中国人呢,否则,现在全世界的计算机都支持而且必须支持GBK,这样,写这样文章的人就不会是我了,而是大洋彼岸的一个金发碧眼的程序员,而且标题也相应改为 “studying the english problem in '大蟒' ”。。哈哈
x = u"中文你好"
print s 运行上述代码,Python会给出下面的错误提示
SyntaxError: Non-ASCII character '\xd6' in file G:\workspace\chinese_problem\src\test.py on line 1, but no encoding declared; see
http://www.python.org/peps/pep-0263.html for details
说是遇到非ASCII字符了,并让我们参考pep-0263。PEP-0263(Python Enhancement Proposal)上面说得很清楚了,Python也意识到了国际化问题,并提出了解决方案。根据提案上面的要求,我们有如下代码
# -*- coding:gb2312 -*- #必须在第一行或者第二行
程序运行的结果如下:
print "-------------code 1----------------" a = "中文a我爱你" print a print a.find("我") b = a.replace("爱", "喜欢") print b print "--------------code 2----------------" x = "中文a我爱你" y = unicode(x, "gb2312") print y.encode("gb2312") print y.find(u"我") z = y.replace(u"爱", u"喜欢") print z.encode("gb2312") print "---------------code 3----------------" print y
-------------code 1----------------
中文a我爱你 5 中文a我喜欢你 --------------code 2---------------- 中文a我爱你 3 中文a我喜欢你 ---------------code 3---------------- Traceback (most recent call last): File "G:\Downloads\eclipse\workspace\p\src\hello.py", line 16, in <module> print y UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128) 我们可以看到,通过引入编码声明,我们可以正常地在使用中文了,而且在code 1和2中,控制台也能正确的把中文打印出来。但是,很明显,上面的代码也反映出了不少的问题: 为什么?为什么?我们可以先在脑海中模拟一下我们使用Python的流程:首先,我们先用编辑器编写好源代码,保存成文件。如果源代码中有编码声明而且用的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中。注意: 编码声明和源文件的编码不一定是一致的,你完全可以在编码声明中声明编码为UTF-8,但是用GB2312来保存源文件。当然,我们不可能自寻烦恼,故意写错,而且好的IDE也能强制保证两者的一致性,但是,如果我们用记事本或者EditPlus等编辑器来编写代码的话,一不小心就会出现这种问题的。 |