深度剖析Python 中文乱码说明

开发 后端
对于每一个IT行业的从业人员,无论是开发人员、项目经理、还是测试人员,掌握了Python 中文乱码会使我们的编程工作更简单和更轻松。

一直以来,Python 中文乱码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢?下面就进行学习相关Python 中文乱码问题。

Python 中文乱码中提到unicode,一般指的是unicode对象,例如'哈哈'的unicode对象为而str,是一个字节数组,这个字节数组表示的是对unicode对象编码(可以是utf-8、gbk、cp936、GB2312)后的存储的格式。这里它仅仅是一个字节流,没有其它的含义,如果你想使这个字节流显示的内容有意义,就必须用正确的编码格式,解码显示。

例如:

setdefaultencoding

对于unicode对象哈哈进行编码,编码成一个utf-8编码的str-s_utf8,s_utf8就是是一个字节数组,存放的就是'\xe5\x93\x88\xe5\x93\x88',但是这仅仅是一个字节数组,如果你想将它通过print语句输出成哈哈,那你就失望了,为什么呢?

因为print语句它的实现是将要输出的内容传送了操作系统,操作系统会根据系统的编码对输入的字节流进行编码,这就解释了为什么utf-8格式的字符串“哈哈”,输出的是“鍝堝搱”。

因为 '\xe5\x93\x88\xe5\x93\x88'用GB2312去解释,其显示的出来就是“鍝堝搱”。这里再强调一下,str记录的是字节数组,只是某种编码的存储格式,至于输出到文件或是打印出来是什么格式,完全取决于其解码的编码将它解码成什么样子。

这里再对print进行一点补充说明:当将一个unicode对象传给print时,在内部会将该unicode对象进行一次转换,转换成本地的默认编码(这仅是个人猜测) str和unicode对象的转换,通过encode和decode实现,具体使用如下:

python 字符串和unicode

将GBK'哈哈'转换成unicode,然后再转换成UTF8 后就可以转换成功,为什么呢?在python中str和unicode在编码和解码过程中。如果将一个str直接编码成另一种编码,会先把str解码成unicode,采用的编码为默认编码,一般默认编码是 ansci i,所以在上面示例代码中***次转换的时候会出错,当设定当前默认编码为'gbk'后,就不会出错了。

在***节已经说过,Python 中文乱码中的字符串,只是一个字节数组,所以当把a情况的str输出到gbk编码的控制台时,就将显示为乱码:鍝堝搱;而当把b情况下的str输出utf-8编码的控制台时,也将显示乱码的问题,是什么也没有,也许'\xb9\xfe\xb9\xfe'用utf-8解码显示,就是空白吧至于reload(sys)是因为 Python2.5 初始化后会删除 sys.setdefaultencoding 这个方法,我们需要重新载入 。

【编辑推荐】

  1. 有关Python系统文件进行介绍指导
  2. 如何正确的使用Python函数
  3. 对Python 构建工具进行详细介绍分析
  4. PythonAndroid浅析Python优势所在
  5. 如何使用Python模块解析配置文件?
责任编辑:chenqingxiang 来源: NET130
相关推荐

2010-02-23 10:50:11

Python 测试框架

2010-02-04 14:01:44

Android应用

2010-06-07 11:13:46

MySQL中文乱码

2010-01-13 10:16:42

C++软件

2010-02-03 16:56:24

Python包

2010-02-01 13:34:59

Python 脚本

2010-02-02 15:25:35

Python语法

2010-03-01 18:33:30

2010-03-01 14:50:06

Python 工具

2010-02-03 09:35:20

Python函数编程

2010-02-02 13:22:06

Python面向对象

2010-02-03 11:26:28

2010-02-24 16:33:28

Python功能

2010-02-26 10:38:29

Python语言

2010-02-23 10:05:52

Python历史

2010-02-26 17:44:40

Python测试框架

2010-02-02 14:22:50

Python示例

2011-06-24 14:46:23

Qt

2010-03-01 16:48:02

Python模块

2010-03-01 17:40:29

Python面向对象语
点赞
收藏

51CTO技术栈公众号