python 中文乱码 问题深入分析

上传人:我*** 文档编号:135970134 上传时间:2020-06-21 格式:DOC 页数:10 大小:90KB
返回 下载 相关 举报
python 中文乱码 问题深入分析_第1页
第1页 / 共10页
python 中文乱码 问题深入分析_第2页
第2页 / 共10页
python 中文乱码 问题深入分析_第3页
第3页 / 共10页
python 中文乱码 问题深入分析_第4页
第4页 / 共10页
python 中文乱码 问题深入分析_第5页
第5页 / 共10页
点击查看更多>>
资源描述

《python 中文乱码 问题深入分析》由会员分享,可在线阅读,更多相关《python 中文乱码 问题深入分析(10页珍藏版)》请在金锄头文库上搜索。

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,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以

2、是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。例如:在这里 su 是unicode对象,s_utf8是字节数组,存储的是unicode 经过utf8编码后的字节,/xe5/x93/x88/xe5/x93/x88同样,s_gbk存储的是unicode经过gbk编码后的字节。在上面print中,为什么print s_utf8为乱码,而print s_gbk就可以显示的是中文?因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流

3、进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”,因为/xe5/x93/x88/xe5/x93/x88用GB2312去解释,其显示的出来就是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测)二、str和unicode对象的转换str和unicode对象的转换,通过encode和decode实现,具体使用

4、如下:将GBK哈哈转换成unicode,然后再转换成UTF8三、设定默认编码 Setdefaultencoding如上图的演示代码所示:当把s(gbk字符串)直接编码成utf-8的时候,将抛出异常,但是通过调用如下代码:1. import sys2.3. reload(sys)4.5. sys.setdefaultencoding(gbk)复制代码后就可以转换成功,为什么呢?在python中str和unicode在编码和解码过程中,如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是anscii,所以在上面示例代码中第一次转换的时候会出错

5、,当设定当前默认编码为gbk后,就不会出错了。至于reload(sys)是因为Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入。四、操作不同文件的编码格式的文件建立一个文件test.txt,文件格式用ANSI,内容为:1. abc中文复制代码用python来读取1. # coding=gbk2.3. print open(Test.txt).read()复制代码结果:1. abc中文复制代码把文件格式改成UTF-8:结果:1. abc涓菡孧复制代码显然,这里需要解码:1. # coding=gbk2.3. import codecs4

6、.5. print open(Test.txt).read().decode(utf-8)复制代码结果:1. abc中文复制代码上面的test.txt我是用Editplus来编辑的,但当我用Windows自带的记事本编辑并存成UTF-8格式时,运行时报错:1. Traceback (most recent call last):2.3. File ChineseTest.py, line 3, in4.5. print open(Test.txt).read().decode(utf-8)6.7. UnicodeEncodeError: gbk codec cant encode charac

7、ter u/ufeff in position 0: illegal multibyte sequence复制代码原来,某些软件,如notepad,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。因此我们在读取时需要自己去掉这些字符,python中的codecs module定义了这个常量:1. # coding=gbk2.3. import codecs4.5. data = open(Test.txt).read()6.7. if data:3 = codecs.BOM_UTF8:8.9. data = data3:10

8、.11. print data.decode(utf-8)复制代码结果:1. abc中文复制代码五、文件的编码格式和编码声明的作用源文件的编码格式对字符串的声明有什么作用呢?这个问题困扰一直困扰了我好久,现在终于有点眉目了,文件的编码格式决定了在该源文件中声明的字符串的编码格式,例如:1. str = 哈哈2.3. print repr(str)复制代码a.如果文件格式为utf-8,则str的值为:/xe5/x93/x88/xe5/x93/x88(哈哈的utf-8编码)b.如果文件格式为gbk,则str的值为:/xb9/xfe/xb9/xfe(哈哈的gbk编码)在第一节已经说过,python中

9、的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许/xb9/xfe/xb9/xfe用utf-8解码显示,就是空白吧。_说完文件格式,现在来谈谈编码声明的作用吧,每个文件在最上面的地方,都会用# coding=gbk 类似的语句声明一下编码,但是这个声明到底有什么用呢?到止前为止,我觉得它的作用也就是三个:a、声明源文件中将出现非ascii编码,通常也就是中文;b、在高级的IDE中,IDE会将你的文件格式保存成你指定编码格式。c、决定源码中类似于u哈这类声

10、明的将哈解码成unicode所用的编码格式,也是一个比较容易让人迷惑的地方,看示例:1. #coding:gbk2. ss = u哈哈3.4. print repr(ss)5.6. print ss:%s % ss复制代码将这个些代码保存成一个utf-8文本,运行,你认为会输出什么呢?大家第一感觉肯定输出的肯定是:1. u/u54c8/u54c82.3. ss:哈哈复制代码但是实际上输出是:1. u/u935d/u581d/u64312.3. ss:鍝堝搱复制代码为什么会这样,这时候,就是编码声明在作怪了,在运行ss = u哈哈的时候,整个过程可以分为以下几步:1) 获取哈哈的编码:由文件编码

11、格式确定,为/xe5/x93/x88/xe5/x93/x88(哈哈的utf-8编码形式)2) 转成unicode编码的时候,在这个转换的过程中,对于/xe5/x93/x88/xe5/x93/x88的解码,不是用utf-8解码,而是用声明编码处指定的编码GBK,将/xe5/x93/x88/xe5/x93/x88按GBK解码,得到就是鍝堝搱,这三个字的unicode编码就是u/u935d/u581d/u6431,至止可以解释为什么print repr(ss)输出的是u/u935d/u581d/u6431了。好了,这里有点绕,我们来分析下一个示例:1. #-*- coding:utf-8 -*-2.

12、3. ss = u哈哈4.5. print repr(ss)6.7. print ss:%s % ss复制代码将这个示例这次保存成GBK编码形式,运行结果,竟然是:1. UnicodeDecodeError: utf8 codec cant decode byte 0xb9 in position 0: unexpected code byte复制代码这里为什么会有utf8解码错误呢?想想上个示例也明白了,转换第一步,因为文件编码是GBK,得到的是哈哈编码是GBK的编码/xb9/xfe/xb9/xfe,当进行第二步,转换成unicode的时候,会用UTF8对/xb9/xfe/xb9/xfe进行解码,而大家查utf-8的编码表会发现,utf8编码表(关于UTF-8解释可参见字符编码笔记:ASCII、UTF-8、UNICODE)中根本不存在,所以会报上述错误。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 事务文书

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号