Python字符串的encode与decode研究心得乱码问题解决方法


Posted in Python onMarch 23, 2009

为什么会报错“UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)”?本文就来研究一下这个问题。


字符串在Python内部的表示是unicode编码,因此,在做编码转换时,通常需要以unicode作为中间编码,即先将其他编码的字符串解码(decode)成unicode,再从unicode编码(encode)成另一种编码。 

decode的作用是将其他编码的字符串转换成unicode编码,如str1.decode('gb2312'),表示将gb2312编码的字符串str1转换成unicode编码。 

encode的作用是将unicode编码转换成其他编码的字符串,如str2.encode('gb2312'),表示将unicode编码的字符串str2转换成gb2312编码。 

因此,转码的时候一定要先搞明白,字符串str是什么编码,然后decode成unicode,然后再encode成其他编码


代码中字符串的默认编码与代码文件本身的编码一致。 

如:s='中文'

如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312。这种情况下,要进行编码转换,都需要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码。通常,在没有指定特定的编码方式时,都是使用的系统默认编码创建的代码文件。 

如果字符串是这样定义:s=u'中文'

则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关。因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可。


如果一个字符串已经是unicode了,再进行解码则将出错,因此通常要对其编码方式是否为unicode进行判断:

isinstance(s, unicode)  #用来判断是否为unicode 

用非unicode编码形式的str来encode会报错 


 如何获得系统的默认编码? 

#!/usr/bin/env python
#coding=utf-8
import sys
print sys.getdefaultencoding()  

该段程序在英文WindowsXP上输出为:ascii 


在某些IDE中,字符串的输出总是出现乱码,甚至错误,其实是由于IDE的结果输出控制台自身不能显示字符串的编码,而不是程序本身的问题。 

如在UliPad中运行如下代码:

s=u"中文"
print s 

会提示:UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)。这是因为UliPad在英文WindowsXP上的控制台信息输出窗口是按照ascii编码输出的(英文系统的默认编码是ascii),而上面代码中的字符串是Unicode编码的,所以输出时产生了错误。

将最后一句改为:print s.encode('gb2312')

则能正确输出“中文”两个字。

若最后一句改为:print s.encode('utf8')

则输出:\xe4\xb8\xad\xe6\x96\x87,这是控制台信息输出窗口按照ascii编码输出utf8编码的字符串的结果。


unicode(str,'gb2312')与str.decode('gb2312')是一样的,都是将gb2312编码的str转为unicode编码 

使用str.__class__可以查看str的编码形式


原理说了半天,最后来个包治百病的吧:)

#!/usr/bin/env python 
#coding=utf-8 
s="中文" if isinstance(s, unicode): 
#s=u"中文" 
print s.encode('gb2312') 
else: 
#s="中文" 
print s.decode('utf-8').encode('gb2312')
Python 相关文章推荐
Python实现的简单算术游戏实例
May 26 Python
python算法演练_One Rule 算法(详解)
May 17 Python
python+opencv实现动态物体识别
Jan 09 Python
python3学生名片管理v2.0版
Nov 29 Python
Django使用AJAX调用自己写的API接口的方法
Mar 06 Python
对django 模型 unique together的示例讲解
Aug 06 Python
python selenium登录豆瓣网过程解析
Aug 10 Python
Python3 Tkinkter + SQLite实现登录和注册界面
Nov 19 Python
Python文本文件的合并操作方法代码实例
Mar 31 Python
Python进度条的使用
May 17 Python
python实现语音常用度量方法的代码详解
May 25 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 02 Python
python 判断自定义对象类型
Mar 21 #Python
python mysqldb连接数据库
Mar 16 #Python
wxpython 学习笔记 第一天
Mar 16 #Python
Python 返回汉字的汉语拼音
Feb 27 #Python
用Python的urllib库提交WEB表单
Feb 24 #Python
wxpython 学习笔记 第一天
Feb 09 #Python
python 输出一个两行字符的变量
Feb 05 #Python
You might like
几种有用的变型 PHP中循环语句的用法介绍
2012/01/30 PHP
Yii Framework框架获取分类下面的所有子类方法
2014/06/20 PHP
php模板引擎技术简单实现
2016/03/15 PHP
PHP FileSystem 文件系统常用api整理总结
2019/07/12 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
JavaScript 基础问答三
2008/12/03 Javascript
js动态创建及移除div的方法
2015/06/03 Javascript
举例讲解JavaScript中将数组元素转换为字符串的方法
2015/10/25 Javascript
通用javascript代码判断版本号是否在版本范围之间
2015/11/29 Javascript
js绘制购物车抛物线动画
2020/11/18 Javascript
AngularJS创建自定义指令的方法详解
2016/11/03 Javascript
微信小程序链接传参并跳转新页面
2016/11/29 Javascript
微信小程序开发之从相册获取图片 使用相机拍照 本地图片上传
2017/04/18 Javascript
vue通过路由实现页面刷新的方法
2018/01/25 Javascript
详解在React里使用"Vuex"
2018/04/02 Javascript
jQuery实现html可联动的百分比进度条
2020/03/26 jQuery
JS 图片压缩原理与实现方法详解
2020/04/29 Javascript
通过实例解析vuejs如何实现调试代码
2020/07/16 Javascript
从零开始用webpack构建一个vue3.0项目工程的实现
2020/09/24 Javascript
[03:07]2015国际邀请赛选手档案EHOME.rOtK 是什么让他落泪?
2015/07/31 DOTA
Python中的__SLOTS__属性使用示例
2015/02/18 Python
详解Golang 与python中的字符串反转
2017/07/21 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
Python3中正则模块re.compile、re.match及re.search函数用法详解
2018/06/11 Python
使用Django连接Mysql数据库步骤
2019/01/15 Python
Django实现基于类的分页功能
2019/10/31 Python
Python3+selenium实现cookie免密登录的示例代码
2020/03/18 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
Space NK美国站:英国高端美妆护肤商城
2017/05/22 全球购物
美国定制钻石订婚戒指:Ritani
2017/12/08 全球购物
AVI-8手表美国官方商店:AVI-8 USA
2019/04/10 全球购物
业务代表的岗位职责
2013/11/16 职场文书
初三学生个人自我评定
2014/04/06 职场文书
2015年挂职锻炼个人总结
2015/10/22 职场文书
react中的DOM操作实现
2021/06/30 Javascript
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle