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批量导出导入MySQL用户的方法
Nov 15 Python
python中列表元素连接方法join用法实例
Apr 07 Python
用python写个自动SSH登录远程服务器的小工具(实例)
Jun 17 Python
python测试mysql写入性能完整实例
Jan 18 Python
关于Python的一些学习总结
May 25 Python
OPENCV去除小连通区域,去除孔洞的实例讲解
Jun 21 Python
python实现n个数中选出m个数的方法
Nov 13 Python
python 定时器,轮询定时器的实例
Feb 20 Python
django的auth认证,authenticate和装饰器功能详解
Jul 25 Python
python redis连接 有序集合去重的代码
Aug 04 Python
Python实现生活常识解答机器人
Jun 28 Python
Python  lambda匿名函数和三元运算符
Apr 19 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禁止某ip或ip地址段访问的方法
2015/02/25 PHP
PHP在线调试执行的实现方法(附demo源码)
2016/04/28 PHP
Thinkphp5 微信公众号token验证不成功的原因及解决方法
2017/11/12 PHP
php 利用socket发送GET,POST请求的实例代码
2020/07/04 PHP
javascript判断iphone/android手机横竖屏模式的函数
2011/12/20 Javascript
解决Jquery鼠标经过不停滑动的问题
2014/03/03 Javascript
javascript Deferred和递归次数限制实例
2014/10/21 Javascript
Angularjs基础知识及示例汇总
2015/01/22 Javascript
jquery在ie7下选择器的问题导致append失效的解决方法
2016/01/10 Javascript
浅述节点的创建及常见功能的实现
2016/12/15 Javascript
Node.js通过身份证号验证年龄、出生日期与性别方法示例
2017/03/09 Javascript
vue项目中使用ueditor的实例讲解
2018/03/05 Javascript
vue-cli项目根据线上环境分别打出测试包和生产包
2018/05/23 Javascript
微信小程序基于高德地图查找位置并显示文字
2019/10/30 Javascript
[02:03]风行者至宝清风环佩外观展示
2020/09/05 DOTA
Python+Opencv识别两张相似图片
2020/03/23 Python
Python时间获取及转换知识汇总
2017/01/11 Python
windows 10下安装搭建django1.10.3和Apache2.4的方法
2017/04/05 Python
Python网络编程之TCP套接字简单用法示例
2018/04/09 Python
Python读取mat文件,并转为csv文件的实例
2018/07/04 Python
解决pyinstaller打包发布后的exe文件打开控制台闪退的问题
2019/06/21 Python
tensorflow中tf.slice和tf.gather切片函数的使用
2020/01/19 Python
浅谈python print(xx, flush = True) 全网最清晰的解释
2020/02/21 Python
python GUI库图形界面开发之PyQt5信号与槽的高级使用技巧装饰器信号与槽详细使用方法与实例
2020/03/06 Python
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
南非最大的在线时尚商店:Zando
2019/07/21 全球购物
上海微创软件面试题
2012/06/14 面试题
本科毕业生专业自荐书范文
2014/02/05 职场文书
项目施工员岗位职责
2014/03/09 职场文书
农林经济管理专业自荐信
2014/09/01 职场文书
教师国庆节演讲稿范文2014
2014/09/21 职场文书
2014入党积极分子批评与自我批评思想报告
2014/10/06 职场文书
工作违纪检讨书范文
2015/01/26 职场文书
WordPress多语言翻译插件 - WPML使用教程
2021/04/01 PHP
MySQL开启事务的方式
2021/06/26 MySQL
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server