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配置文件解析模块ConfigParser使用实例
Apr 13 Python
python实现二维码扫码自动登录淘宝
Dec 27 Python
python中装饰器级连的使用方法示例
Sep 29 Python
python2.7+selenium2实现淘宝滑块自动认证功能
Feb 24 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
Mar 05 Python
python opencv检测目标颜色的实例讲解
Apr 02 Python
python实现推箱子游戏
Mar 25 Python
python 列表递归求和、计数、求最大元素的实例
Nov 28 Python
对Python信号处理模块signal详解
Jan 09 Python
Django框架模板介绍
Jan 15 Python
Python基于pygame实现单机版五子棋对战
Dec 26 Python
python中HTMLParser模块知识点总结
Jan 25 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定时自动生成静态HTML的实现代码
2010/06/20 PHP
php实现MD5加密16位(不要默认的32位)
2013/08/12 PHP
ThinkPHP Mobile使用方法简明教程
2014/06/18 PHP
利用PHP将部分内容用星号替换
2020/04/21 PHP
在laravel中实现事务回滚的方法
2019/10/10 PHP
js屏蔽鼠标键盘(右键/Ctrl+N/Shift+F10/F11/F5刷新/退格键)
2013/01/24 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
js下拉框二级关联菜单效果代码具体实现
2013/08/03 Javascript
jquery中的查找parents与closest方法之间的区别
2013/12/02 Javascript
js遍历子节点子元素附属性及方法
2014/08/19 Javascript
浅析$.getJSON异步请求和同步请求
2016/06/06 Javascript
详解Jquery EasyUI tree 的异步加载(遍历指定文件夹,根据文件夹内的文件生成tree)
2017/02/11 Javascript
Angular.JS内置服务$http对数据库的增删改使用教程
2017/05/07 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
详解Vue.js在页面加载时执行某个方法
2018/11/20 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
用Python的pandas框架操作Excel文件中的数据教程
2015/03/31 Python
浅谈pandas中DataFrame关于显示值省略的解决方法
2018/04/08 Python
python3 kmp 字符串匹配的方法
2018/07/07 Python
浅谈Python的条件判断语句if/else语句
2019/03/21 Python
Python 获取 datax 执行结果保存到数据库的方法
2019/07/11 Python
python 字典访问的三种方法小结
2019/12/05 Python
css3实现可拖动的魔方3d效果
2019/05/07 HTML / CSS
Nike挪威官网:Nike.com (NO)
2018/11/26 全球购物
英文版网络工程师求职信
2013/10/28 职场文书
小组合作学习反思
2014/02/18 职场文书
报关报检委托书
2014/04/08 职场文书
2014群众路线学习笔记
2014/11/06 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
法律讲堂观后感
2015/06/11 职场文书
消防宣传标语大全
2015/08/03 职场文书
志愿者工作心得体会
2016/01/15 职场文书
七年级作文(600字3篇)
2019/09/24 职场文书
《哪吒之魔童降世》观后感:世上哪有随随便便的成功
2019/11/08 职场文书
Python可变与不可变数据和深拷贝与浅拷贝
2022/04/06 Python
MySQL中dd::columns表结构转table过程及应用详解
2022/09/23 MySQL