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中条件选择和循环语句使用方法介绍
Mar 13 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python批量修改文件编码格式的方法
May 31 Python
删除DataFrame中值全为NaN或者包含有NaN的列或行方法
Nov 06 Python
python Kmeans算法原理深入解析
Aug 23 Python
Python求平面内点到直线距离的实现
Jan 19 Python
Python编程快速上手——Excel表格创建乘法表案例分析
Feb 28 Python
python 实现在无序数组中找到中位数方法
Mar 03 Python
Python xml、字典、json、类四种数据类型如何实现互相转换
May 27 Python
Python趣味入门教程之循环语句while
Aug 26 Python
Python实现疫情地图可视化
Feb 05 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 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生成二维码的两个方法和实例
2014/07/01 PHP
固定背景实现的背景滚动特效示例分享
2013/05/19 Javascript
js 获取时间间隔实现代码
2014/05/12 Javascript
jQuery修改CSS伪元素属性的方法
2014/07/30 Javascript
js定义类的几种方法(推荐)
2016/06/08 Javascript
jquery+css实现简单的图片轮播效果
2017/08/07 jQuery
Node.js利用断言模块assert进行单元测试的方法
2017/09/28 Javascript
浅谈Node模块系统及其模式
2017/11/17 Javascript
JavaScript实现的DOM树遍历方法详解【二叉DOM树、多叉DOM树】
2018/05/07 Javascript
jQuery-Citys省市区三级菜单联动插件使用详解
2019/07/26 jQuery
VUE前后端学习tab写法实例
2019/08/06 Javascript
小程序和web画三角形实现解析
2019/09/02 Javascript
vue倒计时刷新页面不会从头开始的解决方法
2020/03/03 Javascript
[07:03]显微镜下的DOTA2第九期——430圣堂刺客杀戮秀
2014/06/20 DOTA
[51:26]DOTA2上海特级锦标赛主赛事日 - 2 胜者组第一轮#3Secret VS OG第二局
2016/03/03 DOTA
[03:54]Ehome出征西雅图 回顾2016国际邀请赛晋级之路
2016/08/02 DOTA
python内存管理分析
2015/04/08 Python
Python and、or以及and-or语法总结
2015/04/14 Python
Python使用MYSQLDB实现从数据库中导出XML文件的方法
2015/05/11 Python
python中私有函数调用方法解密
2016/04/29 Python
一个月入门Python爬虫学习,轻松爬取大规模数据
2018/01/03 Python
python 3.3 下载固定链接文件并保存的方法
2018/12/18 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
django中使用Celery 布式任务队列过程详解
2019/07/29 Python
Python使用grequests(gevent+requests)并发发送请求过程解析
2019/09/25 Python
Python中six模块基础用法
2019/12/08 Python
Python连接字符串过程详解
2020/01/06 Python
浅析Django 接收所有文件,前端展示文件(包括视频,文件,图片)ajax请求
2020/03/09 Python
Python 为什么推荐蛇形命名法原因浅析
2020/06/18 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
玛蒂尔达简服装:Matilda Jane Clothing
2019/02/13 全球购物
德国药房apodiscounter中文官网:德国排名前三的网上药店
2019/06/03 全球购物
异步传递消息系统的作用
2016/05/01 面试题
善意的谎言事例
2014/02/15 职场文书
暑期社会实践心得体会
2014/09/02 职场文书