`
tian19870221075
  • 浏览: 6206 次
文章分类
社区版块
存档分类
最新评论

Python中文问题研究

 
阅读更多

我曾经在深 入浅出java中文问题 系列中研究过java的中文问题,现在中文问题已经不再羁绊我在java世界中漫游的脚步了。最近,对Python产生了 浓厚的兴趣,谁知道跟中文问题这个老朋友又一次不期而遇。看来,在代码世界中,中文问题会在很长一段时间里跟我们形影不离。这也难怪,谁让当初发明计算机 的不是我们中国人呢,否则,现在全世界的计算机都支持而且必须支持GBK,这样,写这样文章的人就不会是我了,而是大洋彼岸的一个金发碧眼的程序员,而且 标题也相应改为 “studying the english problem in '大蟒' ”。。哈哈
    YY而已,还是面对现实问题吧。相对java而言,中文问题在Python中的表现更为激烈。“激烈”的意思不是说更为严重或者说难于解决,只是 Python对于decode&encode错误的默认处理方式为strict,也就是直接报错,而java使用replace的方式来处理了,因此 java出现中文问题后会打印出很多"??"。此外,Python的默认的encoding是ASCII,而java的默认encoding跟操作系统的 encoding是一致的。在这一点上,我觉得java更为合理,这样对程序员更为友好,也减少了newbies 开始时的挫折感,是有利于语言的推广的。但是,Python也有它的道理,毕竟ASCII是唯一的全世界所有平台都支持的字符集,而且问题始终是问题,始 终会出现的,逃避它还不如早点面对它。
   好了,说了这么多,该说说Python中中文问题的症状了。在这之前,我们先要了解Python中有两种字符串,分别是一般的字符串(每个字符用8 bits表示)和Unicode字符串(每个字符用一个或者多个字节表示),它们可以相互转换。关于Unicode,Joel Spolsky 在 The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!) 中有生动的说明,Jason Orendorff 在 Unicode for programmers  有着更为全面的描述,在此我就不再多说什么了。来看下面的代码:

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)

....................................................................

    为什么?为什么?我们可以先在脑海中模拟一下我们使用Python的流程:首先,我们先用编辑器编写好源代码,保存成文件。如果源代码中有编码声明而且用 的编辑器支持该语法,那么该文件就以相应的编码方式保存在磁盘中。注意: 编码声明和源文件的编码不一定是一致的,你完 全可以在编码声明中声明编码为UTF-8,但是用GB2312来保存源文件。当然,我们不可能自寻烦恼,故意写错,而且好的IDE也能强制保证两者的一致 性,但是,如果我们用记事本或者EditPlus等编辑器来编写代码的话,一不小心就会出现这种问题的。
    得到一个.py文件后,我们就可以运行它了,这是,我们就把代码交给Python解析器来完成解析工作。解析器读入文件时,先解析文件中的编码声明,我们 假设文件的编码为gb2312,那么先将文件中的内容由gb2312转换成Unicode,然后再把这些Unicode转换为UTF-8格式的字节串。完 成这一步骤后,解析器把这些UTF-8字节串分段,解析。如果遇到使用Unicode字符串,那么就使用相应的UTF-8字节串创建Unicode字符 串,如果程序中使用的是一般的字符串,那么解析器先将UTF-8字节串通过Unicode转换成相应编码(这里就是gb2312编码)的字节串,并用其创 建一般的字符串对象。也就是说,Unicode字符串跟一般字符串在内存中的存放格式是不一样的,前者使用UTF-8的格式,后者使用GB2312格式。
    好了,内存中的字符串存放格式我们知道了,下面我们要了解print的工作方式。print其实只是负责把内存中相应的字节串交给操作系统,让操作系统相 应的程序(譬如cmd窗口)进行显示。这里有两种情况:
   1、若字符串是一般的字符串,那么print只需把内存中相应的字节串推送给操作系统。如例子中的code 1。
    2、如果字符串是Unicode字符串,那么print在推送之前先进行相应的encode:我们可以显示使用Unicode的encode方法使用合适 的编码方式来编码(例子中code 2),否则Python使用默认的编码方式进行编码,也就是ASCII(例子中的code 3)。当然ASCII是不可能正确编码中文的,因此Python报错。
    至此,上面的三个问题我们已经可以解析第一和第三个了。至于第二个问题,因为Python中有两种字符串,一般字符串和Unicode字符串,两者都有各 自的字符处理方法。对于前者,方法是以字节的方式进行的,而且在GB2312中,每个汉字占用两个字节,因此得到的结果是5;对于后者,也就是 Unicode字符串,所有字符都是统一看待的,因此得到3。
     虽然上面只提到了控制台程序的中文问题,但是文件读写以及网络传输中出现的中文问题在原理上都是类似的。Unicode的出现可以很大程度上解决软件的国 际化问题,同时Python为Unicode提供了极为良好的支持,因此,我建议大家在编写Python的程序时,都统一使用Unicode方式。保存文 件时使用UTF-8的编码方式。How to Use UTF-8 with Python有详细的描述,大家可以参考一下。
    Python中能导致出现中文问题的地方还很多,譬如文件的读写,网络数据的传输等,希望大家能多多交流,共同解决这些问题。

 

from:http://hi.baidu.com/daping_zhang/blog/item/09dda71ea9d7d21f4134173e.html

本文固定链接:http://www.verydemo.com/demo_c122_i15391.html

分享到:
评论

相关推荐

    Python研究 从新手到高手 Dive Into Python 中文版

    Python 从新手到高手 Dive Into Python 是为有经验的程序员编写的一本 Python 书。 1.在多个平台安装Python 2.第一个Python程序 3.内置数据类型 4.自省的威力 5.对象和面向对象 6.异常和文件处理 7.正则表达式 8....

    Python3.10官方开发文档(中文版)

    Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言...

    Python3.8官方开发文档(中文版)

    Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。 Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言...

    python中文库-python人工智能大数据自动化接口测试开发。

    python中文库-python人工智能大数据自动化接口测试开发。 书籍下载及python库汇总https://china-testing.github.io/

    Head First Python、Python核心编程

    通过应用认知科学和学习理论的最新研究成果,《Head First Python(中文版)》可以让你投入一个需要多感官参与的学习体验,这本书采用丰富直观的形式使你的大脑真正开动起来,而不是长篇累牍地说教,让你昏昏欲睡。...

    基于Python语言的中文文本处理研究.pdf

    基于Python语言的中文文本处理研究.pdf

    python基础教程第三版中文版

    此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识。最后,作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了几个...

    Python程序设计课程在线思政教学研究.pdf

    Python程序设计课程在线思政教学研究.pdf

    Python3 CookBook 中文版

    Python3 CookBook 中文版 这本书的目标读者是那些想深入理解Python语言机制和最新编程技能的资深程序员。很多讨论都是标准 库,框架和应用程序使用到的高级技术。本书所有示例均假设读者已经有了一定的编程背景并且...

    Python参考手册(第四版)中文

    此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识。最后,作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了几个...

    python基础教程第二版(高清书签中文)

    python 基础教程 第二版 高清 书签 中文: 本书包括Python程序设计的方方面面,首先从Python的安装开始,随后介绍了Python的基础知识和基本概念,包括列表、元组、字符串、字典以及各种语句。然后循序渐进地介绍了...

    Head First Python(中文版)

    通过应用认知科学和学习理论的最新研究成果,《Head First Python(中文版)》可以让你投入一个需要多感官参与的学习体验,这本书采用丰富直观的形式使你的大脑真正开动起来,而不是长篇累牍地说教,让你昏昏欲睡。

    Python编程入门经典(中文)

    ◆深入研究如何为模块和程序编写测试 ◆介绍如何使用python编写gui ◆着重介绍xml、html、xsl和相关技术 ◆解释如何扩展python ◆分享数值编程技术 ◆介绍jython的内部机理,jython是一个用java编写的python版本

    Python基础教程 (第3版).pdf

    此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识;最后,作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了10个...

    在会计研究中使用 Python 进行文本分析-研究论文

    会计研究中文本数据的重要性显着增加。 为了帮助研究人员理解和使用文本数据,本专着定义和描述了文本数据的常用度量,然后演示了使用 Python 编程语言收集和处理文本数据。 该专着充满了示例代码,这些代码复制了...

    中文 Python 笔记

    中文 Python 笔记 中文 Python 笔记 中文 Python 笔记

    Python基础教程第三版(中文版)带目录

    此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识;作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了10个具有...

    深入Python3 中文版

    《深入 Python 3》中有何新内容 安装 Python 第一份 Python 程序 内置数据类型 ...案例研究:将 chardet 移植到 Python 3 Python 类库打包 使用 2to3 将代码移植到 Python 3 特殊方法名称 接下来阅读什么?

    python基础教程第三版(中文)

    此后探讨了如何将Python与数据库、网络、C语言等工具结合使用,从而发挥出Python的强大功能,同时介绍了Python程序测试、打包、发布等知识;最后,作者结合前面讲述的内容,按照实际项目开发的步骤向读者介绍了10个...

Global site tag (gtag.js) - Google Analytics