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 anaconda 安装 环境变量 升级 以及特殊库安装的方法
Jun 21 Python
Python线性回归实战分析
Feb 01 Python
python调用摄像头显示图像的实例
Aug 03 Python
Python中的取模运算方法
Nov 10 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python并发爬虫实用工具tomorrow实用解析
Sep 25 Python
python使用正则来处理各种匹配问题
Dec 22 Python
python的slice notation的特殊用法详解
Dec 27 Python
检测tensorflow是否使用gpu进行计算的方式
Feb 03 Python
Python使用Excel将数据写入多个sheet
May 16 Python
numpy实现RNN原理实现
Mar 02 Python
Python中常见的反爬机制及其破解方法总结
Jun 10 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
怎么样可以把 phpinfo()屏蔽掉?
2006/11/24 PHP
PHP 程序员也要学会使用“异常”
2009/06/16 PHP
PHP实现文件下载断点续传详解
2014/10/15 PHP
php去掉文件前几行的方法
2015/07/29 PHP
使用PHP+AJAX让WordPress动态加载文章的教程
2015/12/11 PHP
根据分辨率不同,调用不同的css文件
2006/08/25 Javascript
Javascript !!的作用
2008/12/04 Javascript
Javascript结合css实现网页换肤功能
2009/11/02 Javascript
Jquery AJAX 框架的使用方法
2009/11/03 Javascript
firefox插件Firebug的使用教程
2010/01/02 Javascript
js怎么终止程序return不行换jfslk
2013/05/30 Javascript
仿淘宝TAB切换搜索框搜索切换的相关内容
2014/09/21 Javascript
Javascript基础教程之if条件语句
2015/01/18 Javascript
Nodejs实现文件上传的示例代码
2017/09/26 NodeJs
详解Vue SPA项目优化小记
2018/07/03 Javascript
解决layui前端框架 form表单,table表等内置控件不显示的问题
2018/08/19 Javascript
基于VUE实现的九宫格抽奖功能
2018/09/30 Javascript
原生js实现贪食蛇小游戏的思路详解
2019/11/26 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
python监控网站运行异常并发送邮件的方法
2015/03/13 Python
python 调用c语言函数的方法
2017/09/29 Python
Python中函数的返回值示例浅析
2019/08/28 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
英国在线女鞋目的地:SIMMI
2018/12/27 全球购物
年终考核评语
2014/01/19 职场文书
班级活动策划书
2014/02/06 职场文书
银行办公室岗位职责
2014/03/10 职场文书
安全生产演讲稿
2014/05/09 职场文书
开服装店计划书
2014/08/15 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
骨干教师事迹材料
2014/12/17 职场文书
2016年中秋节慰问信
2015/12/01 职场文书
标准演讲稿格式结尾应该怎么书写?
2019/07/17 职场文书
成人成长感言如何写?
2019/08/16 职场文书
Python字典的基础操作
2021/11/01 Python
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js