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 相关文章推荐
python33 urllib2使用方法细节讲解
Dec 03 Python
编写Python爬虫抓取豆瓣电影TOP100及用户头像的方法
Jan 20 Python
使用Python的Scrapy框架十分钟爬取美女图
Dec 26 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
centos 安装python3.6环境并配置虚拟环境的详细教程
Feb 22 Python
python3安装pip3(install pip3 for python 3.x)
Apr 03 Python
windows下安装Python的XlsxWriter模块方法
May 03 Python
如何优雅地改进Django中的模板碎片缓存详解
Jul 04 Python
python使用epoll实现服务端的方法
Oct 16 Python
Python os.access()用法实例
Feb 18 Python
python利用Excel读取和存储测试数据完成接口自动化教程
Apr 30 Python
使用sublime text3搭建Python编辑环境的实现
Jan 12 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
新版mysql+apache+php Linux安装指南
2006/10/09 PHP
PHP XML备份Mysql数据库
2009/05/27 PHP
防止用户利用PHP代码DOS造成用光网络带宽
2011/03/01 PHP
PHP递归返回值时出现的问题解决办法
2013/02/19 PHP
页面乱码问题的根源及其分析
2013/08/09 PHP
JScript中的undefined和&quot;undefined&quot;的区别
2007/03/08 Javascript
Javascript 陷阱 window全局对象
2008/11/26 Javascript
formValidator3.3的ajaxValidator一些异常分析
2011/07/12 Javascript
DIV外区域Click后关闭DIV的实现代码
2011/12/21 Javascript
使用JQuery实现的分页插件分享
2015/11/05 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
怎么限制input的text里输入的值只能是数字(正则、js)
2016/05/16 Javascript
javascript之IE版本检测超简单方法
2016/08/20 Javascript
jQuery 特性操作详解及实例代码
2016/09/29 Javascript
利用jsonp与代理服务器方案解决跨域问题
2017/09/14 Javascript
vue-cli 首屏加载优化问题
2018/11/06 Javascript
微信小程序实现上拉加载功能示例【加载更多数据/触底加载/点击加载更多数据】
2020/05/29 Javascript
Vue触发input选取文件点击事件操作
2020/08/07 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
JavaScript 如何在浏览器中使用摄像头
2020/12/02 Javascript
[45:25]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.22
2019/09/05 DOTA
[01:02:47]EG vs Secret 2019国际邀请赛淘汰赛 胜者组 BO3 第一场 8.21.mp4
2020/07/19 DOTA
python访问纯真IP数据库的代码
2011/05/19 Python
Python使用Socket(Https)Post登录百度的实现代码
2012/05/18 Python
可能是最全面的 Python 字符串拼接总结【收藏】
2018/07/09 Python
学python安装的软件总结
2019/10/12 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
html5默认气泡修改的代码详解
2020/03/13 HTML / CSS
欧迪办公美国官网:Office Depot
2016/08/22 全球购物
美国值得信赖的婚恋交友网站:eHarmony
2018/10/04 全球购物
自我评价中英文语句
2013/11/30 职场文书
《一株紫丁香》教学反思
2014/02/19 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
2015年人力资源部工作总结
2015/04/30 职场文书
nginx如何将http访问的网站改成https访问
2021/03/31 Servers
python中pd.cut()与pd.qcut()的对比及示例
2022/06/16 Python