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之有点简约的元组
Sep 24 Python
跟老齐学Python之玩转字符串(2)更新篇
Sep 28 Python
python绘图方法实例入门
May 19 Python
浅谈Python的文件类型
May 30 Python
详解用Python处理HTML转义字符的5种方式
Dec 27 Python
Python基于pyCUDA实现GPU加速并行计算功能入门教程
Jun 19 Python
Python3.4 tkinter,PIL图片转换
Jun 21 Python
Python中一些深不见底的“坑”
Jun 12 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
python 穷举指定长度的密码例子
Apr 02 Python
Python简单实现词云图代码及步骤解析
Jun 04 Python
Python Pandas pandas.read_sql函数实例用法
Jun 21 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来实现网络服务
2009/09/15 PHP
php报表之jpgraph柱状图实例代码
2011/08/22 PHP
php&amp;mysql 日期操作小记
2012/02/27 PHP
php中http_build_query 的一个问题
2012/03/25 PHP
PHP中使用sleep造成mysql读取失败的案例和解决方法
2014/08/21 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
PHP单例模式模拟Java Bean实现方法示例
2018/12/07 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
laravel 错误处理,接口错误返回json代码
2019/10/25 PHP
JavaScript 对象、函数和继承
2009/07/07 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
Javascript中call和apply函数的比较和使用实例
2015/02/03 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
Bootstrap CSS布局之图像
2016/12/17 Javascript
react router 4.0以上的路由应用详解
2017/09/21 Javascript
jQuery实现ajax回调函数带入参数的方法示例
2018/06/26 jQuery
JavaScript实现左右滚动电影画布
2020/02/06 Javascript
vue项目前端微信JSAPI与外部H5支付相关实现过程及常见问题
2020/04/14 Javascript
如何在现代JavaScript中编写异步任务
2021/01/31 Javascript
[02:42]DOTA2城市挑战赛收官在即 四强之争风起云涌
2018/06/05 DOTA
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
wxpython布局的实现方法
2019/11/01 Python
在python tkinter界面中添加按钮的实例
2020/03/04 Python
解析python 中/ 和 % 和 //(地板除)
2020/06/28 Python
Pycharm创建python文件自动添加日期作者等信息(步骤详解)
2021/02/03 Python
老海军美国官网:Old Navy
2016/09/05 全球购物
三星英国官网:Samsung英国
2018/09/25 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
服务中心夜班服务员岗位职责
2013/11/27 职场文书
大学老师推荐信
2014/02/25 职场文书
2014小学植树节活动总结
2014/03/10 职场文书
大学生入党自传2015
2015/06/26 职场文书
安全生产培训心得体会
2016/01/18 职场文书
阿里云日志过滤器配置日志服务
2022/04/09 Servers
Python获取字典中某个key的value
2022/04/13 Python