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读写ini文件示例(python读写文件)
Mar 25 Python
在Django的模型中执行原始SQL查询的方法
Jul 21 Python
详解Python文件修改的两种方式
Aug 22 Python
解决tensorflow训练时内存持续增加并占满的问题
Jan 19 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
Mar 16 Python
k-means 聚类算法与Python实现代码
Jun 01 Python
python解释器安装教程的方法步骤
Jul 02 Python
PyTorch: Softmax多分类实战操作
Jul 07 Python
如何在scrapy中捕获并处理各种异常
Sep 28 Python
详解python os.path.exists判断文件或文件夹是否存在
Nov 16 Python
对PyTorch中inplace字段的全面理解
May 22 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 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实现对两个数组进行减法操作的方法
2015/04/17 PHP
为你总结一些php信息函数
2015/10/21 PHP
详解PHP字符串替换str_replace()函数四种用法
2017/10/13 PHP
PHP实现的pdo连接数据库并插入数据功能简单示例
2019/03/30 PHP
showModelessDialog()使用详解
2006/09/07 Javascript
window.location和document.location的区别分析
2008/12/23 Javascript
使弱类型的语言JavaScript变强势
2009/06/22 Javascript
javascript取消文本选定的实现代码
2010/11/14 Javascript
jquery 查找select ,并触发事件的实现代码
2011/03/30 Javascript
Javascript中匿名函数的多种调用方式总结
2013/12/06 Javascript
Extjs grid panel自带滚动条失效的解决方法
2014/09/11 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
jquery获取复选框checkbox的值的简单实现方法
2016/05/26 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
详解Vue自定义过滤器的实现
2017/01/10 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
2017/06/09 Javascript
React-intl 实现多语言的示例代码
2017/11/03 Javascript
微信小程序获取手机系统信息的方法【附源码下载】
2017/12/07 Javascript
Angular CLI在Angular项目中如何使用scss详解
2018/04/10 Javascript
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
2019/04/24 Javascript
javascript 对象 与 prototype 原型用法实例分析
2019/11/11 Javascript
webpack5 联邦模块介绍详解
2020/07/08 Javascript
Python 字典与字符串的互转实例
2017/01/13 Python
Python XML转Json之XML2Dict的使用方法
2019/01/15 Python
Python中常用的内置方法
2019/01/28 Python
python 解决Fatal error in launcher:错误问题
2020/05/21 Python
keras自定义回调函数查看训练的loss和accuracy方式
2020/05/23 Python
Python常用扩展插件使用教程解析
2020/11/02 Python
中国一家综合的外贸B2C电子商务网站:DealeXtreme(DX)
2020/03/10 全球购物
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
百度JavaScript笔试题
2015/01/15 面试题
学生会辞职信
2015/03/02 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书