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解析json实例方法
Nov 19 Python
linux系统使用python监测系统负载脚本分享
Jan 15 Python
Python获取远程文件大小的函数代码分享
May 13 Python
python动态参数用法实例分析
May 25 Python
Python中的super()方法使用简介
Aug 14 Python
python微信公众号开发简单流程
Mar 23 Python
python list数据等间隔抽取并新建list存储的例子
Nov 27 Python
Python发送邮件封装实现过程详解
May 09 Python
python能在浏览器能运行吗
Jun 17 Python
Python调用百度OCR实现图片文字识别的示例代码
Jul 17 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 25 Python
Python 调用C++封装的进一步探索交流
Mar 04 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中查询SQL Server或Sybase时TEXT字段被截断的解决方法
2009/03/10 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
laravel框架中表单请求类型和CSRF防护实例分析
2019/11/23 PHP
JavaScript静态的动态
2006/09/18 Javascript
分享20款好玩的jQuery游戏
2011/04/17 Javascript
jQuery LigerUI 使用教程入门篇
2012/01/18 Javascript
网页下载文件期间如何防止用户对网页进行其他操作
2014/06/27 Javascript
window.location 对象所包含的属性
2014/10/10 Javascript
在JavaScript应用中实现延迟加载的方法
2015/06/25 Javascript
js实现iPhone界面风格的单选框和复选框按钮实例
2015/08/18 Javascript
谈谈对offsetleft兼容性的理解
2015/11/11 Javascript
详解使用nodeJs安装Vue-cli
2017/05/17 NodeJs
js判断数组是否包含某个字符串变量的实例
2017/11/24 Javascript
利用node实现一个批量重命名文件的函数
2017/12/21 Javascript
angular6.x中ngTemplateOutlet指令的使用示例
2018/08/09 Javascript
Angular4.0动画操作实例详解
2019/05/10 Javascript
vue学习笔记之过滤器的基本使用方法实例分析
2020/02/01 Javascript
浅谈JavaScript中等号、双等号、 三等号的区别
2020/08/06 Javascript
[02:27]2018DOTA2亚洲邀请赛赛前采访-OpTic
2018/04/03 DOTA
python控制台英汉汉英电子词典
2020/04/23 Python
Python的Flask框架应用程序实现使用QQ账号登录的方法
2016/06/07 Python
celery4+django2定时任务的实现代码
2018/12/23 Python
详解Python中的测试工具
2019/06/09 Python
用Python实现BP神经网络(附代码)
2019/07/10 Python
Parts Express:音频、视频和扬声器的第一来源
2017/04/25 全球购物
美国在线印刷公司:PsPrint
2017/10/12 全球购物
工商管理专业学生的自我评价
2013/10/01 职场文书
求职简历推荐信范文
2013/12/02 职场文书
农民工工资发放承诺书
2014/03/31 职场文书
2014年征兵标语
2014/06/20 职场文书
大专毕业生求职信
2014/07/05 职场文书
2015年行政执法工作总结
2015/05/23 职场文书
2015年税务稽查工作总结
2015/05/26 职场文书
立秋之描写立秋的作文(五年级)
2019/08/08 职场文书
Redis性能监控的实现
2021/07/09 Redis
python运算符之与用户交互
2022/04/13 Python