笔记三:python乱码深度剖析一
一:学习内容
- python编码转换
- python乱码原因深入解析
二:python编码转换
1. Python内部字符串一般都是Unicode编码,代码中字符串的默认编码与代码文件本身的编码是一致的。
2. Python编码转换通常是要以unicode作为中间编码进行转换的,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。
3. Python编码转换实例:gbk存储的字符—>decode('gbk')—>unicode—>encode('utf-8')
编码转换流程解析如下:
a. decode的作用是将其他编码的字符串转换成unicode编码。
例如:name.decode('GB2312'),表示将GB2312编码的字符串name转换成unicode编码。
b. encode的作用是将unicode编码转换成其他编码的字符串。
例如:name.encode('GB2312'),表示将unicode字符串name转换成GB2312编码。
c. 进行编码转换的时候必须先知道name是哪种编码,然后decode成unicode编码,最后在encode成需要的编码。
d. name已经就是unicode编码了,那么就不需要进行decode进行解码转换了,直接用encode就可以编码成你所需要的编码。
三:python乱码原因剖析
1. raw_input("请输入字符串".decode('utf-8').encode('gbk')),正常输出

可以看到这里打印是正确的,不会乱码。
原因:上面我已经学习了python编码转换,必须要用unicode作为中间码来转换,此处文件是utf-8,而cmd默认编码为gbk,所以我们中文需要先解码成unicode(decode('utf-8')),在编码成gbk(encode('gbk'))就可以正常显示了
2. raw_input(u"请输入字符串".decode('utf-8').encode('gbk')),输出报错

因为加上u的意思是解码成unicode,此时你又执行了解码. decode('utf-8')就会报错。.decode('utf-8')的作用就是u’中文’解码成unicode。
3. print u"中文",打印正常中文
对于字符串的打印,python的逻辑为:
a. 如果是unicode字符串,则可以自动编码为终端所用编码,然后正确显示出来。
比如u’中文’即将’中文’转换为unicode字符,输出到windows默认编码的gbk的cmd中,则python可以自动的将unicode编码为gbk,然后输出到cmd中
print u’中文’的效果类似于 print '中文'.decode(‘utf-8’)
需要注意的是:你所要打印出来的字符,虽然是unicode,但是其中如果包含了某些特殊字符,而对应的特殊字符在终端所用的编码中不存在,比如将含某些特殊字符的Unicode字符串,打印到windows的默认编码为GBK的cmd中,而GBK编码集合中,本身就没有这些字符,所以,当然也是无法显示,会出现对应的UnicodeEncodeError的错误的。
b. 如果是某种编码类型的str,则需要将该str的编码类型和目标终端匹配。
比如gbk的字符串,输出到windows默认编码为gbk的cmd中,就不会乱码。
字符串的类型也就是我们上面说的是字符串的编码,是由文件所用的实际编码决定的,即文件保存为什么编码格式的字符串就是什么编码格式。如:文件声明为#encoding=utf-8,文件保存为gbk,则文件中字符串格式为gbk。
比如utf-8字符串,输出到windows默认编码为gbk的cmd中,就会乱码,我们需要将该utf-8字符串.decode('utf-8')即解码为unicode编码,然后.encode('gbk')(注意:此处不进行.encode('gbk')也可以,因为上面说了print打印系统可以自动将unicode编码为终端所用编码)才能在cmd中正常输出。字符的编码和解码,要求解码的字符串与当前字符串的编码(文件保存为什么类型字符串编码就是什么类型)一致。
即windows默认情况下cmd的输出中:
print u'中文' == print '中文'.decode('utf-8') == print '中文'.decode('utf-8').encode('gbk')
3. 输出字典中的中文
我们知道字典中如果有中文,一般打印出来都是显示的存储的编码模式:

不能显示成中文,可以用如下办法来打印整个字典并让中文正常显示:
#encoding=utf-8
import json
a={u'测试':0,u'开发':0}
dic={}
for i in a:
dic[i]=0
print json.dumps(dic,ensure_ascii=False,encoding='utf-8')

这样就能显示成中文了。
笔记三:python乱码深度剖析一的更多相关文章
- 笔记四:python乱码深度剖析二
一:学习内容 获取更改系统编码 判断字符的编码类型 文件存储和读取的编码 二:获取更改系统编码 1. 获取系统编码 import sys print sys.getdefaultencoding() ...
- libevent学习笔记(参考libevent深度剖析)
最近自学libevent事件驱动库,参考的资料为libevent2.2版本以及张亮提供的<Libevent源码深度剖析>, 参考资料: http://blog.csdn.net/spark ...
- ASP.NET乱码深度剖析
写在前面 在Web开发中,乱码应该算一个常客了.今天还好好的一个页面,第二天过来打开一看,中文字符全变“外星文”了.有时为了解决这样的问题,需要花上很长的时间去调试,直至抓狂,笔者也曾经历过这样的时期 ...
- 数据库学习笔记 (三) python操作数据库
python 操作MYSQL数据库主要有两种方式: 使用原生模块:pymysql ORM框架:SQLAchemy 一.pymysql 1.1下载安装模块 第一种:cmd下:执行命令下载安装:pip3 ...
- Netty学习笔记(三)——netty源码剖析
1.Netty启动源码剖析 启动类: public class NettyNioServer { public static void main(String[] args) throws Excep ...
- jquery源码学习笔记三:jQuery工厂剖析
jquery源码学习笔记二:jQuery工厂 jquery源码学习笔记一:总体结构 上两篇说过,query的核心是一个jQuery工厂.其代码如下 function( window, noGlobal ...
- Python学习笔记(三)Python的list和tuple
list list类似其他语言中的数组,是一种有序的集合,可以随时添加和删除其中的元素. 使用len()函数可以获得list元素的个数. list的索引从0开始,当超出范围时会报IndexError错 ...
- 读书笔记之:C语言深度剖析
读书笔记之:C语言深度剖析 <C 语言深度解剖>这本书是一本“解开程序员面试笔试的秘密”的好书.作者陈正冲老师提出“以含金量勇敢挑战国内外同类书籍”,确实,这本书中的知识点都是一些在面试中 ...
- DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
最近花了点时间把<破坏之王-DDOS攻击与防范深度剖析>看了一遍,坦白来说,这本书比较浅显,可以说是入门书,当然对于我这种对DDOS一知半解的人来说,也是一本不错的书,起码我 ...
随机推荐
- windows7,windows8 64位系统 IIS7.0配置.net网站时报错:未能加载文件或程序集“XXX”或它的某一个依赖项。试图加载格式不正确的程序。
背景: 在64位的操作系统中, IIS7.0配置.net网站时报错:未能加载文件或程序集“XXX”或它的某一个依赖项.试图加载格式不正确的程序. 解决办法: 把iis 对应的应用程序池 --高级设置- ...
- Java web 调试技巧之查看浏览器中调试中的network
在java web开发过程中尤其后台开发经常需要查看浏览器调试中的network项:今天在开发在线预览系统时用到了flexpaper插件,这个插件会调用FlexPaperViewer.swf这个软件( ...
- Need You Now --Lady Antebellum
战地女神(Lady Antebellum)由女主唱 Hillary Scott.男主唱 Charles Kelley .吉他/键盘手 Dave Haywood,2006夏天在美国乡村音乐重镇纳什维尔组 ...
- How To Use XDOLoader to Manage, Download and Upload Files? (文档 ID 469585.1)
Applies to: BI Publisher (formerly XML Publisher) - Version 5.6.3 to 5.6.3 [Release 5] Information ...
- Ubuntu/Debian下通过Apt-get简单安装Oracle JDK
近几年本人对各种Arm小板,开发板不明原因中毒,基本以Linux系统为主,本篇文章以记录在32位Arm的Debian8上,通过Apt-get的简单命令安装Oracle JDK8并成功的记录. 1.首先 ...
- shell模拟“多线程”
shell中并没有真正意义上的多线程,要实现"多线程"可以启动多个子进程,并将子进程放入后台执行来模拟多线程,最大程度利用CPU性能. 循环中执行并行代码 #!/bin/bas ...
- IOS下HTML5获取焦点 弹键盘
IOS下sifari和webview默认屏蔽textarea/inputbox获取焦点弹出键盘 苹果移动设备的WebView默认屏蔽textarea/inputbox获取焦点弹出键盘,需要在APP页面 ...
- 第1章 敏捷思维—“互联网+”知识工作者必备的DNA
1.1 强化敏捷思维,落实“十三五”双创战略 史蒂夫·布兰克观察美国创业环境,提出创新生态四个方面:动机.管理工具.文化.基础建设,开创LLP创新创业模式. 1.2 现代敏捷管理发展趋势 1.敏捷 ...
- 一个初学者的指南,使用D3做数据绑定
一个初学者的指南,使用D3做数据绑定 D3.js 是个强大的数据可视化库,可以做出惊艳的图表.比如:气泡图,线图和条形图--只需要很少行的代码 随着初学者对JavaScript的理解,可以将数组或者对 ...
- C#使用cplex求解简单线性规划问题(Cplex系列-教程二)
若还未在项目中添加cplex的引用,可以参阅上一篇文章.本文主要介绍利用C#求解线性规划的步骤,对线性规划模型进行数据填充的两种方法,以及一些cplex函数的功能和用法.包括以下几个步骤: 描述 先花 ...