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实现给字典添加条目的方法
Sep 25 Python
零基础写python爬虫之神器正则表达式
Nov 06 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
Python封装shell命令实例分析
May 05 Python
python中利用await关键字如何等待Future对象完成详解
Sep 07 Python
python实现协同过滤推荐算法完整代码示例
Dec 15 Python
Python多线程扫描端口代码示例
Feb 09 Python
解决Python3 抓取微信账单信息问题
Jul 19 Python
python3 下载网络图片代码实例
Aug 27 Python
Django实现CAS+OAuth2的方法示例
Oct 30 Python
Python Django中间件,中间件函数,全局异常处理操作示例
Nov 08 Python
Python高并发解决方案实现过程详解
Jul 31 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
sqlyog 中文乱码问题的设置方法
2008/10/19 PHP
php从右向左/从左向右截取字符串的实现方法
2011/11/28 PHP
PHP中实现接收多个name相同但Value不相同表单数据实例
2015/02/03 PHP
PHPExcel简单读取excel文件示例
2016/05/26 PHP
ThinkPHP实现分页功能
2017/04/28 PHP
一个判断email合法性的函数[非正则]
2008/12/09 Javascript
JS+CSS实现的经典tab选项卡效果代码
2015/09/16 Javascript
JavaScript引用类型和基本类型详解
2016/01/06 Javascript
jquery+css实现侧边导航栏效果
2017/06/12 jQuery
Vue2几种常见开局方式详解
2017/09/09 Javascript
vue多页面开发和打包正确处理方法
2018/04/20 Javascript
浅谈Vue 性能优化之深挖数组
2018/12/11 Javascript
ant-design-vue 快速避坑指南(推荐)
2020/01/21 Javascript
vue项目启动出现cannot GET /服务错误的解决方法
2020/04/26 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
js 数据类型判断的方法
2020/12/03 Javascript
[01:09:01]完美世界DOTA2联赛循环赛 Magma vs PXG BO2第一场 10.28
2020/10/28 DOTA
python使用sorted函数对列表进行排序的方法
2015/04/04 Python
批量获取及验证HTTP代理的Python脚本
2017/04/23 Python
利用Python读取文件的四种不同方法比对
2017/05/18 Python
windows下python之mysqldb模块安装方法
2017/09/07 Python
python re.sub()替换正则的匹配内容方法
2019/07/22 Python
GDAL 矢量属性数据修改方式(python)
2020/03/10 Python
关于Python turtle库使用时坐标的确定方法
2020/03/19 Python
python实现人脸签到系统
2020/04/13 Python
scrapy爬虫:scrapy.FormRequest中formdata参数详解
2020/04/30 Python
北美领先的智能产品购物网站:Wellbots
2018/06/11 全球购物
毕业生自我鉴定
2013/11/05 职场文书
优秀村官事迹材料
2014/01/10 职场文书
办理护照工作证明
2014/10/10 职场文书
旷工检讨书1000字
2015/01/01 职场文书
家属答谢词
2015/01/05 职场文书
2015年汽车销售工作总结
2015/04/07 职场文书
2019年聘任书的写作格式及范文!
2019/07/03 职场文书
纪念建国70周年演讲稿
2019/07/19 职场文书
MySQL对数据表已有表进行分区表的实现
2021/11/01 MySQL