python中文乱码问题深入分析分析.doc

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
python中文乱码问题深入分析分析

python 中文乱码问题深入分析一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢? 在本文中,以哈来解释作示例解释所有的问题,“哈”的各种编码如下: 1. UNICODE (UTF8-16),C854; 2. UTF-8,E59388; 3. GBK,B9FE。 一、python中的str和unicode 一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢? 在python中提到unicode,一般指的是unicode对象,例如哈哈的unicode对象为 u\u54c8\u54c8 而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。 例如: 将GBK哈哈转换成unicode,然后再转换成UTF8 三、Setdefaultencoding 如上图的演示代码所示: 当把s(gbk字符串)直接编码成utf-8的时候,将抛出异常,但是通过调用如下代码: import?sys reload(sys) sys.setdefaultencoding(gbk) 后就可以转换成功,为什么呢?在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为gbk后,就不会出错了。 至于reload(sys)是因为Python2.5?初始化后会删除?sys.setdefaultencoding?这个方法,我们需要重新载入。 四、操作不同文件的编码格式的文件 建立一个文件test.txt,文件格式用ANSI,内容为: abc中文 用python来读取 # coding=gbk print open(Test.txt).read() 结果:abc中文 把文件格式改成UTF-8: 结果:abc涓枃 显然,这里需要解码: # coding=gbk import codecs print open(Test.txt).read().decode(utf-8) 结果:abc中文 上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时, 运行时报错: Traceback (most recent call last): File ChineseTest.py, line 3, in? print open(Test.txt).read().decode(utf-8) UnicodeEncodeError: gbk codec cant encode character u\ufeff in position 0: illegal multibyte sequence 原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。 因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量: # coding=gbk import codecs data = open(Test.txt).read() if data[:3] == codecs.BOM_UTF8: data = data[3:] print data.decode(utf-8) 结果:abc中文 五、文件的编码格式和编码声明的作用 源文件的编码格式对字符串的声明有什么作用呢?这个问题困扰一直困扰了我好久,现在终于有点眉目了,文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如: str?=?哈哈 print?repr(str) a.如果文件格式为utf-8,则str的值为:\xe5\x93\x88\xe5\x93\x88(哈哈的utf-8编码) b.如果文件格式为gbk,则str的值为:\xb9\xfe\xb9\xfe(哈哈的gbk编码) 在第一节已经说过,python中的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许\xb9\xfe\xb9\xfe用utf-8解码显示,就是空白吧。_ 说

文档评论(0)

yaocen + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档