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 相关文章推荐
Flask SQLAlchemy一对一,一对多的使用方法实践
Feb 10 Python
在Python的Flask框架下收发电子邮件的教程
Apr 21 Python
Django卸载之后重新安装的方法
Mar 15 Python
python+selenium实现京东自动登录及秒杀功能
Nov 18 Python
Python使用wxPython实现计算器
Jan 30 Python
Python网络编程之TCP与UDP协议套接字用法示例
Feb 02 Python
更改Python的pip install 默认安装依赖路径方法详解
Oct 27 Python
python对验证码降噪的实现示例代码
Nov 12 Python
Python GUI库PyQt5图形和特效样式QSS介绍
Feb 25 Python
利用Python将多张图片合成视频的实现
Nov 23 Python
Python打包exe时各种异常处理方案总结
May 18 Python
Python基本的内置数据类型及使用方法
Apr 13 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适配器模式介绍
2012/08/14 PHP
基于linnux+phantomjs实现生成图片格式的网页快照
2015/04/15 PHP
PHP实现的AES 128位加密算法示例
2019/09/16 PHP
jQuery的强大选择器小结
2009/12/27 Javascript
JavaScript中按位“异或”运算符使用介绍
2014/03/14 Javascript
IE中的File域无法清空使用jQuery重设File域
2014/04/24 Javascript
js实现字符串的16进制编码不加密
2014/04/25 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
简单总结JavaScript中的String字符串类型
2016/05/26 Javascript
关于Javascript中defer和async的区别总结
2016/09/20 Javascript
jQuery窗口拖动功能的实现代码
2017/02/04 Javascript
vue2.0 datepicker使用方法
2018/02/04 Javascript
JS实现同一DOM元素上onClick事件与onDblClick事件并存的解决方法
2018/06/07 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
2019/01/19 Javascript
Node.js中console.log()输出彩色字体的方法示例
2019/12/01 Javascript
关于vue3.0中的this.$router.replace({ path: '/'})刷新无效果问题
2020/01/16 Javascript
Vue路由的模块自动化与统一加载实现
2020/06/05 Javascript
[04:54]DOTA2 2017国际邀请赛:上届冠军WINGS采访短片
2017/08/09 DOTA
简单说明Python中的装饰器的用法
2015/04/24 Python
利用python生成一个导出数据库的bat脚本文件的方法
2016/12/30 Python
用Python登录好友QQ空间点赞的示例代码
2017/11/04 Python
python使用Pandas库提升项目的运行速度过程详解
2019/07/12 Python
python图形用户接口实例详解
2019/12/16 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
英国Zoro工具:手动工具,电动工具和个人防护用品
2016/11/02 全球购物
FLOS美国官网:意大利高级照明工艺的传奇
2018/08/07 全球购物
某科技软件测试面试题
2013/05/19 面试题
铁路个人事迹材料
2014/01/30 职场文书
可口可乐广告词
2014/03/20 职场文书
毕业典礼主持词大全
2014/03/26 职场文书
完美的中文自荐信
2014/05/24 职场文书
做人民满意的公务员活动方案
2014/08/25 职场文书
超市督导岗位职责
2015/04/10 职场文书
旅行社计调工作总结
2015/08/12 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书
Python Flask请求扩展与中间件相关知识总结
2021/06/11 Python