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实现把xml或xsl转换为html格式
Apr 08 Python
Python中用于返回绝对值的abs()方法
May 14 Python
django开发之settings.py中变量的全局引用详解
Mar 29 Python
python实现外卖信息管理系统
Jan 11 Python
django 微信网页授权认证api的步骤详解
Jul 30 Python
Python Django简单实现session登录注销过程详解
Aug 06 Python
Python实现常见的几种加密算法(MD5,SHA-1,HMAC,DES/AES,RSA和ECC)
May 09 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
使用TensorBoard进行超参数优化的实现
Jul 06 Python
python实现代码审查自动回复消息
Feb 01 Python
Python如何配置环境变量详解
May 18 Python
Python Django模型详解
Oct 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
swfupload 多文件上传实现代码
2008/08/27 PHP
php download.php实现代码 跳转到下载文件(response.redirect)
2009/08/26 PHP
php切割页面div内容的实现代码分享
2012/07/31 PHP
PHP中使用匿名函数操作数据库的例子
2014/11/17 PHP
PHP常用文件操作函数和简单实例分析
2016/06/03 PHP
PHP magento后台无法登录问题解决方法
2016/11/24 PHP
PHP编程实现的TCP服务端和客户端功能示例
2018/04/13 PHP
js不是基础的基础
2006/12/24 Javascript
JavaScript 学习笔记(四)
2009/12/31 Javascript
解决jquery的datepicker的本地化以及Today问题
2012/05/23 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
动态加载dtree.js树treeview(示例代码)
2013/12/17 Javascript
javascript移出节点removeChild()使用介绍
2014/04/03 Javascript
删除javascript所创建子节点的方法
2015/05/21 Javascript
nodejs实现遍历文件夹并统计文件大小
2015/05/28 NodeJs
网页从弹窗页面单选框传值至父页面代码分享
2015/09/29 Javascript
Bootstrap3使用typeahead插件实现自动补全功能
2016/07/07 Javascript
微信和qq时间格式模板实例详解
2016/10/21 Javascript
JS实现图片放大镜插件详解
2017/11/06 Javascript
webpack+vuex+axios 跨域请求数据的示例代码
2018/03/06 Javascript
Vue引入sass并配置全局变量的方法
2018/06/27 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
python3正则提取字符串里的中文实例
2019/01/31 Python
python从ftp获取文件并下载到本地
2020/12/05 Python
使用layui框架实现点击左侧导航切换右侧内容且右侧选项卡跟随变化的效果
2020/11/10 HTML / CSS
HTML5 body设置全屏背景图片的示例代码
2020/12/08 HTML / CSS
JAVA和C++区别都有哪些
2015/03/30 面试题
求职推荐信
2013/10/28 职场文书
市三好学生主要事迹
2014/01/28 职场文书
通信研究生自荐信
2014/02/01 职场文书
八年级语文教学反思
2014/02/11 职场文书
社区健康教育实施方案
2014/03/18 职场文书
2014年话务员工作总结
2014/11/19 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
《落花生》教学反思
2016/02/16 职场文书
你离财务总监还有多远?速览CFO的岗位职责
2019/11/18 职场文书