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文件和目录操作详解
Feb 08 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
Django框架下在URLconf中指定视图缓存的方法
Jul 23 Python
Python中使用插入排序算法的简单分析与代码示例
May 04 Python
利用numpy+matplotlib绘图的基本操作教程
May 03 Python
用python生成(动态彩色)二维码的方法(使用myqr库实现)
Jun 24 Python
解决python多行注释引发缩进错误的问题
Aug 23 Python
Python hashlib模块实例使用详解
Dec 24 Python
python为Django项目上的每个应用程序创建不同的自定义404页面(最佳答案)
Mar 09 Python
PyQt5事件处理之定时在控件上显示信息的代码
Mar 25 Python
Python3.9新特性详解
Oct 10 Python
Python可视化神器pyecharts绘制地理图表
Jul 07 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
十大感人催泪爱情动漫 第一名至今不忍在看第二遍
2020/03/04 日漫
php获取远程图片的两种 CURL方式和sockets方式获取远程图片
2011/11/07 PHP
PHP使用http_build_query()构造URL字符串的方法
2016/04/02 PHP
php自定义函数br2nl实现将html中br换行符转换为文本输入中换行符的方法【与函数nl2br功能相反】
2017/02/17 PHP
php之可变函数的实例详解
2017/09/13 PHP
PHP基于openssl实现的非对称加密操作示例
2019/01/11 PHP
PhpStorm配置Xdebug调试的方法步骤
2019/02/02 PHP
javascript 计算两个整数的百分比值
2009/12/26 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
JS中的form.submit()不能提交表单的错误原因
2014/10/08 Javascript
微信JS接口汇总及使用详解
2015/01/09 Javascript
jQuery中replaceAll()方法用法实例
2015/01/16 Javascript
javascript弹出页面回传值的方法
2015/01/28 Javascript
微信WeixinJSBridge API使用实例
2015/05/25 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
Vue.js 中的 v-show 指令及用法详解
2018/11/19 Javascript
JS获取今天是本月第几周、本月共几周、本月有多少天、是今年的第几周、是今年的第几天的示例代码
2018/12/05 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
JavaScript中reduce()的5个基本用法示例
2020/07/19 Javascript
详解vue修改elementUI的分页组件视图没更新问题
2020/11/13 Javascript
原生js实现滑块区间组件
2021/01/20 Javascript
python flask框架实现重定向功能示例
2019/07/02 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
Django实现列表页商品数据返回教程
2020/04/03 Python
详解Pycharm第三方库的安装及使用方法
2020/12/29 Python
CSS3实现全景图特效示例代码
2018/03/26 HTML / CSS
艺术专业大学生自我评价
2013/09/22 职场文书
药品采购员岗位职责
2014/02/08 职场文书
公司总经理助理岗位职责
2014/07/09 职场文书
离婚协议书样本
2015/01/26 职场文书
六一儿童节园长致辞
2015/07/31 职场文书
《平移和旋转》教学反思
2016/02/19 职场文书
导游词之太原天龙山
2020/01/02 职场文书
Jpa Specification如何实现and和or同时使用查询
2021/11/23 Java/Android