在讲解Python中文问题之前,先说一下什么是Python,前一阵对Python产生了浓厚的兴趣,谁知道跟中文问题这个老朋友又一次不期而遇,看来,在代码中,Python中文的问题总是常常的困扰着我们的。。
这也难怪,谁让当初发明计算机的不是我们中国人呢,否则,现在全世界的计算机都支持而且必须支持GBK,这样。写这样文章的人就不会是我了,而是大洋彼岸的一个金发碧眼的程序员,而且标题也相应改为 “studying the english problem in '大蟒' ”。
还是面对现实问题吧。相对java而言,中文问题在Python中的表现更为激烈。“激烈”的意思不是说更为严重或者说难于解决。只是 Python对于decode&encode错误的默认处理方式为strict,也就是直接报错,而java使用replace的方式来处理了,因此 java出现中文问题后会打印出很多"??"。
此外,Python的默认的encoding是ASCII,而java的默认encoding跟操作系统的 encoding是一致的。在这一点上,我觉得java更为合理,这样对程序员更为友好,也减少了newbies 开始时的挫折感,是有利于语言的推广的。
但是,Python也有它的道理,毕竟ASCII是***的全世界所有平台都支持的字符集,而且问题始终是问题,始终会出现的,逃避它还不如早点面对它。好了,说了这么多,该说说Python中中文问题的症状了。在这之前,我们先要了解Python中有两种字符串,分别是一般的字符串(每个字符用8 bits表示)和Unicode字符串(每个字符用一个或者多个字节表示)。
它们可以相互转换,有着更为全面的描述,在此我就不再多说什么了。来看下面的代码:
- # -*- 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
说是遇到非ASCII字符了,并让我们参考pep-0263。PEP-0263(Python Enhancement Proposal)上面说得很清楚了,Python也意识到了国际化问题,并提出了解决方案。根据提案上面的要求,我们有如下代码:
- -------------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)
我们可以看到,通过引入Python中文问题声明,我们可以正常地在使用中文了,而且在code 1和2中,控制台也能正确的把中文打印出来。但是,很明显,上面的代码也反映出了不少的问题:
1、code 1 和 2在使用print时采用了不同的方式,1是直接print,而2在print之前先进行编码
2、code 1 和 2中在同样的字符串查找同一个字符“我”,得出的结果不一样(分别是5和3)
3、code 3 中直接打印unicode字符串 y时出现错误(这也是为什么code 2中要先进行编码的原因)
【编辑推荐】