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数据结构之二叉树的建立实例
Apr 29 Python
整理Python 常用string函数(收藏)
May 30 Python
利用python生成一个导出数据库的bat脚本文件的方法
Dec 30 Python
Centos7 下安装最新的python3.8
Oct 28 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
如何安装并在pycharm使用selenium的方法
Apr 30 Python
浅谈keras中的后端backend及其相关函数(K.prod,K.cast)
Jun 29 Python
Python 实现微信自动回复的方法
Sep 11 Python
matplotlib绘制鼠标的十字光标的实现(内置方式)
Jan 06 Python
python元组拆包实现方法
Feb 28 Python
如何在C++中调用Python
May 21 Python
利用Matlab绘制各类特殊图形的实例代码
Jul 16 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
Syphon 秘笈
2021/03/03 冲泡冲煮
php使用curl和正则表达式抓取网页数据示例
2014/04/13 PHP
TP5框架使用QueryList采集框架爬小说操作示例
2020/03/26 PHP
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
js简单实现删除记录时的提示效果
2013/12/05 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
分享15个大家都熟知的jquery小技巧
2015/12/02 Javascript
在微信、支付宝、百度钱包实现点击返回按钮关闭当前页面和窗口的方法
2016/08/05 Javascript
你知道setTimeout是如何运行的吗?
2016/08/16 Javascript
微信小程序 数据绑定详解及实例
2016/10/25 Javascript
谈谈Vue.js——vue-resource全攻略
2017/01/16 Javascript
微信小程序 利用css实现遮罩效果实例详解
2017/01/21 Javascript
Javascript中的 “&amp;” 和 “|” 详解
2017/02/02 Javascript
原生Aajax 和jQuery Ajax 写法个人总结
2017/03/24 jQuery
vue2利用Bus.js如何实现非父子组件通信详解
2017/08/25 Javascript
细说webpack源码之compile流程-rules参数处理技巧(2)
2017/12/26 Javascript
Echart折线图手柄触发事件示例详解
2018/12/16 Javascript
jQuery实现左右两个列表框的内容相互移动功能示例
2019/01/27 jQuery
javascript获取元素的计算样式
2019/05/24 Javascript
Vue.js 中的实用工具方法【推荐】
2019/07/04 Javascript
[04:32]玩具屠夫中文语音节选
2020/08/23 DOTA
python计数排序和基数排序算法实例
2014/04/25 Python
Python Requests 基础入门
2016/04/07 Python
解决Django生产环境无法加载静态文件问题的解决
2019/04/23 Python
python取余运算符知识点详解
2019/06/27 Python
python3.6中@property装饰器的使用方法示例
2019/08/17 Python
Python三元运算与lambda表达式实例解析
2019/11/30 Python
Tensorflow 1.0之后模型文件、权重数值的读取方式
2020/02/12 Python
Python如何转换字符串大小写
2020/06/04 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
接口自动化多层嵌套json数据处理代码实例
2020/11/20 Python
CSS3悬停效果案例应用
2012/11/21 HTML / CSS
法人授权委托书格式
2014/04/08 职场文书
销售个人求职信范文
2014/04/28 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
银行培训心得体会范文
2016/01/09 职场文书