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绘制人人网好友关系图示例
Apr 01 Python
python格式化字符串实例总结
Sep 28 Python
Windows下安装python2.7及科学计算套装
Mar 05 Python
Python2.6版本中实现字典推导 PEP 274(Dict Comprehensions)
Apr 28 Python
Python xlrd读取excel日期类型的2种方法
Apr 28 Python
python在Windows下安装setuptools(easy_install工具)步骤详解
Jul 01 Python
Python并发编程协程(Coroutine)之Gevent详解
Dec 27 Python
django使用xlwt导出excel文件实例代码
Feb 06 Python
python实现年会抽奖程序
Jan 22 Python
python中threading开启关闭线程操作
May 02 Python
python如何建立全零数组
Jul 19 Python
用python读取xlsx文件
Dec 17 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
PHP导出MySQL数据到Excel文件(fputcsv)
2011/07/03 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
javascript String 对象
2008/04/25 Javascript
js 实现无干扰阴影效果 简单好用(附文件下载)
2009/12/27 Javascript
JQuery中$(document)是什么意思有什么作用
2014/07/21 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
15个jquery常用方法、小技巧分享
2015/01/13 Javascript
javascript比较两个日期相差天数的方法
2015/07/23 Javascript
jQuery实现鼠标滑过链接控制图片的滑动展开与隐藏效果
2015/10/28 Javascript
JavaScript的React框架中的JSX语法学习入门教程
2016/03/05 Javascript
浅析Bootstrap缩略图组件与警示框组件
2016/04/29 Javascript
有关easyui-layout中的收缩层无法显示标题的解决办法
2016/05/10 Javascript
微信小程序 获取相册照片实例详解
2016/11/16 Javascript
JS和JQuery实现雪花飘落效果
2017/11/30 jQuery
javascript中函数的写法实例代码详解
2018/10/28 Javascript
node 文件上传接口的转发的实现
2019/09/23 Javascript
JavaScript实现留言板案例
2020/03/17 Javascript
rhythmbox中文名乱码问题解决方法
2008/09/06 Python
打包发布Python模块的方法详解
2016/09/18 Python
Python爬虫爬取新浪微博内容示例【基于代理IP】
2018/08/03 Python
python+mysql实现教务管理系统
2019/02/20 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
使用NumPy读取MNIST数据的实现代码示例
2019/11/20 Python
Selenium环境变量配置(火狐浏览器)及验证实现
2020/12/07 Python
杰夫·班克斯男士服装网上商店:Jeff Banks
2019/10/24 全球购物
公务员职业生涯规划书范文  
2014/01/19 职场文书
药品采购员岗位职责
2014/02/08 职场文书
大学生优秀班干部事迹材料
2014/05/26 职场文书
安全施工责任书
2014/08/25 职场文书
公司收款委托书范本
2014/09/20 职场文书
优秀班集体申报材料
2014/12/25 职场文书
2015年小学开学寄语
2015/02/27 职场文书
小学教学工作总结2015
2015/05/13 职场文书
mybatis使用oracle进行添加数据的方法
2021/04/27 Oracle