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

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

ID:55632075

大小:90.00 KB

页数:10页

时间:2020-05-21

python 中文乱码 问题深入分析.doc_第1页
python 中文乱码 问题深入分析.doc_第2页
python 中文乱码 问题深入分析.doc_第3页
python 中文乱码 问题深入分析.doc_第4页
python 中文乱码 问题深入分析.doc_第5页
资源描述:

《python 中文乱码 问题深入分析.doc》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、python中文乱码问题深入分析在本文中,以'哈'来解释作示例解释所有的问题,“哈”的各种编码如下:  1.UNICODE(UTF8-16),C854;  2.UTF-8,E59388;  3.GBK,B9FE。一、python中的str和unicode一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?在python中提到unicode,一般指的是unicode对象。例如'哈哈'的unicode对象为1.u'/u54c8/u54c8'复制代码而str,是一个

2、字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。例如:在这里su是unicode对象,s_utf8是字节数组,存储的是unicode经过utf8编码后的字节,'/xe5/x93/x88/xe5/x93/x88'同样,s_gbk存储的是unicode经过gbk编码后的字节。在上面print中,为什么prints_utf8为乱码,而prints_gbk就可以显示的是中

3、文?因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为'/xe5/x93/x88/xe5/x93/x88'用GB2312去解释,其显示的出来就是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转

4、换成本地的默认编码(这仅是个人猜测)二、str和unicode对象的转换str和unicode对象的转换,通过encode和decode实现,具体使用如下:将GBK'哈哈'转换成unicode,然后再转换成UTF8三、设定默认编码Setdefaultencoding如上图的演示代码所示:当把s(gbk字符串)直接编码成utf-8的时候,将抛出异常,但是通过调用如下代码:1.importsys2.3.reload(sys)4.5.sys.setdefaultencoding('gbk')复制代码后就可以转换成功,为什么呢?在python中str和un

5、icode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。至于reload(sys)是因为Python2.5初始化后会删除sys.setdefaultencoding这个方法,我们需要重新载入。四、操作不同文件的编码格式的文件建立一个文件test.txt,文件格式用ANSI,内容为:1.abc中文复制代码用python来读取1.#coding=gbk2.3.prin

6、topen("Test.txt").read()复制代码结果:1.abc中文复制代码把文件格式改成UTF-8:结果:1.abc涓菡孧复制代码显然,这里需要解码:1.#coding=gbk2.3.importcodecs4.5.printopen("Test.txt").read().decode("utf-8")复制代码结果:1.abc中文复制代码上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,运行时报错:1.Traceback(mostrecentcalllast):2.3.Fi

7、le"ChineseTest.py",line3,in 4.5.printopen("Test.txt").read().decode("utf-8")1.2.UnicodeEncodeError:'gbk'codeccan'tencodecharacteru'/ufeff'inposition0:illegalmultibytesequence复制代码原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF0xBB0xBF,即BOM)。因此我们在读取时需要自己去掉这些字符,python

8、中的codecsmodule定义了这个常量:1.#coding=gbk2.3.importcodecs4.5.data=o

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。