python中的编码知识整理汇总


Posted in Python onJanuary 26, 2016

问题

在平时工作中,遇到了这样的错误:

UnicodeDecodeError: 'ascii' codec can't decode byte

想必大家也都碰到过,很常见 。于是决定对python的编码做一个整理和学习。

基础知识

在python2.x中,有两种数据类型,unicode和str,这两个都是basestring的子类

>>> a = '中'
>>> type(a)
<type 'str'>
>>> isinstance(a,basestring)
True
>>> a = u'中'
>>> type(a)
<type 'unicode'>
>>> isinstance(a,basestring)
True

两者的区别,概括来讲,str是字节串,由unicode经过编码(encode)后的字节组成的(好比与python3.x的byte);unicode是对象,才是真正意义上的字符串,由字符组成

>>> a='中文'
>>> len(a)
6
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b=u'中文'
>>> len(b)
2
>>> repr(b)
"u'\\u4e2d\\u6587'"

控制台和脚本

在linux下的python控制台执行以下命令,所得的结果和执行脚本是不同的

>>> a = u'中文'
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> b = unicode('中文','utf-8')b)
>>> repr(b)
"u'\\u4e2d\\u6587'"

可以看到,u'中文'初始化的对象a不是我们所期望的,那究竟是什么原因呢?
将python看成是一根管子,管子里头处理的中间过程都是使用unicode的。入口处,全部转成unicode;出口处,再转成目标编码(当然,有例外,处理逻辑中要用到具体编码的情况)。
在控制台执行命令a = u'中文',可以将解释为命令,a = ‘中文'.decode(encode),从而到到unicode对象a。那么这里的encode是什么呢?对于控制台来说,就是标准输入,即sys.stdin.encoding

>>> sys.stdin.encoding
'ISO-8859-1'

我的这边控制台默认的编码是ISO-8859-1,故a = u'中文' <=> a = '中文'.decode('ISO-8859-1')
这里的'中文'是控制台理解的,即使根据终端编码方式编码后的字节码,对于utf-8编码的终端,'中文'='\\xe4\\xb8\\xad\\xe6\\x96\\x87'

>>> a='中文'.decode('ISO-8859-1') 
>>> repr(a)
"u'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"

那如何修改此编码值呢,设置为什么呢?在linux环境中设置环境变量方法如下,具体设置什么只要与终端编码方式一直即可

export PYTHONIOENCODING=UTF-8

总结

重新回到最初的那个问题,造成问题的原因是没有搞清楚unicode和str的区别,将两者进行了混用。

>>> a = '中文'
>>> a.encode('gbk')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe4 in position 0: ordinal not in range(128)

以上的对象a其实是str,即字节码,若终端是utf-8编码的话,那么a就是用utf-8 encode的字节码。a.encode('gbk') 等价于a.decode(encoding).encode('gbk'),即先将字节码解码为unicode字符,然后再encode为字节码。unicode对象作为中转站。那么这里的encoding是什么呢?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'

默认是ascii,这正是错误为什么报无法用ascii解码的原因

>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> a = '中文'
>>> repr(a)
"'\\xe4\\xb8\\xad\\xe6\\x96\\x87'"
>>> a.encode('gbk')
'\xd6\xd0\xce\xc4'

将默认编码改为utf-8,即可。不鼓励对str使用encode方法,因为其中隐式对str进行了解码。decode只对str,encode只对unicode,一切decode/encode都显示指定编码方式。

Python 相关文章推荐
Python操作CouchDB数据库简单示例
Mar 10 Python
Python标准库defaultdict模块使用示例
Apr 28 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
python自动化脚本安装指定版本python环境详解
Sep 14 Python
python引入不同文件夹下的自定义模块方法
Oct 27 Python
python 调用有道api接口的方法
Jan 03 Python
python 正则表达式贪婪模式与非贪婪模式原理、用法实例分析
Oct 14 Python
基于Django实现日志记录报错信息
Dec 17 Python
使用python图形模块turtle库绘制樱花、玫瑰、圣诞树代码实例
Mar 16 Python
Python Django搭建网站流程图解
Jun 13 Python
Python流程控制语句的深入讲解
Jun 15 Python
Python 线程池模块之多线程操作代码
May 20 Python
在MAC上搭建python数据分析开发环境
Jan 26 #Python
python黑魔法之编码转换
Jan 25 #Python
Python编程中对文件和存储器的读写示例
Jan 25 #Python
Python开发如何在ubuntu 15.10 上配置vim
Jan 25 #Python
详解Python验证码识别
Jan 25 #Python
Python网站验证码识别
Jan 25 #Python
谈谈Python进行验证码识别的一些想法
Jan 25 #Python
You might like
php smarty 二级分类代码和模版循环例子
2011/06/01 PHP
php格式化电话号码的方法
2015/04/24 PHP
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
2007/04/27 Javascript
jQuery的实现原理的模拟代码 -1 核心部分
2010/08/01 Javascript
jQuery模拟点击A标记示例参考
2014/04/17 Javascript
jQuery图片切换插件jquery.cycle.js使用示例
2014/06/16 Javascript
input:checkbox多选框实现单选效果跟radio一样
2014/06/16 Javascript
avascript中的自执行匿名函数应用示例
2014/09/15 Javascript
jQuery中scrollLeft()方法用法实例
2015/01/16 Javascript
用javascript实现自动输出网页文本
2015/07/30 Javascript
JS实现超精简响应鼠标显示二级菜单代码
2015/09/12 Javascript
jQuery实现浮动层随浏览器滚动条滚动的方法
2015/09/22 Javascript
使用JQuery实现Ctrl+Enter提交表单的方法
2015/10/22 Javascript
整理Javascript函数学习笔记
2015/12/01 Javascript
jquery文字填写自动高度的实现方法
2016/11/07 Javascript
vue.js数据绑定的方法(单向、双向和一次性绑定)
2017/07/13 Javascript
react-native DatePicker日期选择组件的实现代码
2017/09/12 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
5 种JavaScript编码规范
2018/01/30 Javascript
Layui数据表格之获取表格中所有的数据方法
2018/08/20 Javascript
Node.js实现一个HTTP服务器的方法示例
2019/05/13 Javascript
微信小程序 组件的外部样式externalClasses使用详解
2019/09/06 Javascript
[03:49]显微镜下的DOTA2第十五期—VG登基之路完美团
2014/06/24 DOTA
Python循环语句之break与continue的用法
2015/10/14 Python
Python中MySQLdb和torndb模块对MySQL的断连问题处理
2015/11/09 Python
Python基于二分查找实现求整数平方根的方法
2016/05/12 Python
基于Python代码编辑器的选用(详解)
2017/09/13 Python
python 日期操作类代码
2018/05/05 Python
python selenium firefox使用详解
2019/02/26 Python
Python线程条件变量Condition原理解析
2020/01/20 Python
keras打印loss对权重的导数方式
2020/06/10 Python
几款主流好用的富文本编辑器(所见即所得常用编辑器)介绍
2021/03/17 Javascript
护士节策划方案
2014/05/19 职场文书
运动会广播稿200字
2014/10/18 职场文书
个人作风纪律整顿整改措施
2014/10/25 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android