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的urllib库提交WEB表单
Feb 24 Python
Python聚类算法之基本K均值实例详解
Nov 20 Python
python Django模板的使用方法
Jan 14 Python
python3使用PyMysql连接mysql数据库实例
Feb 07 Python
Python实现对特定列表进行从小到大排序操作示例
Feb 11 Python
Python I/O与进程的详细讲解
Mar 08 Python
Python3实现的旋转矩阵图像算法示例
Apr 03 Python
python将类似json的数据存储到MySQL中的实例
Jul 12 Python
利用python实现冒泡排序算法实例代码
Dec 01 Python
python GUI库图形界面开发之PyQt5信号与槽事件处理机制详细介绍与实例解析
Mar 08 Python
Python实现从N个数中找到最大的K个数
Apr 02 Python
Python正则表达式如何匹配中文
May 27 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
解析如何去掉CodeIgniter URL中的index.php
2013/06/25 PHP
PHP简单读取PDF页数的实现方法
2016/07/21 PHP
PHP入门教程之数学运算技巧总结
2016/09/11 PHP
PHP集成环境XAMPP的安装与配置
2018/11/13 PHP
PHP+MySql实现一个简单的留言板
2020/07/19 PHP
CSS+JS构建的图片查看器
2006/07/22 Javascript
javascript生成/解析dom的CDATA类型的字段的代码
2007/04/22 Javascript
走出JavaScript初学困境—js初学
2008/12/29 Javascript
javascript hashtable实现代码
2009/10/13 Javascript
JavaScript监听和禁用浏览器回车事件实例
2015/01/31 Javascript
jQuery 3.0中存在问题及解决办法
2016/07/15 Javascript
vue基础之data存储数据及v-for循环用法示例
2019/03/08 Javascript
vue 实现Web端的定位功能 获取经纬度
2019/08/08 Javascript
vue-loader中引入模板预处理器的实现
2019/09/04 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
Python处理XML格式数据的方法详解
2017/03/21 Python
python去除扩展名的实例讲解
2018/04/23 Python
Python3实现取图片中特定的像素替换指定的颜色示例
2019/01/24 Python
python将字母转化为数字实例方法
2019/10/04 Python
python数据化运营的重要意义
2019/11/25 Python
学习python需要有编程基础吗
2020/06/02 Python
Python实现Kerberos用户的增删改查操作
2020/12/14 Python
Jo Malone美国官网:祖玛珑香水
2017/03/27 全球购物
微软美国官方网站:Microsoft美国
2018/05/10 全球购物
经典c++面试题三
2015/07/08 面试题
武汉世纪畅想数字传播有限公司.NET笔试题
2014/07/22 面试题
春风行动实施方案
2014/03/28 职场文书
2014年小学教师工作总结
2014/11/10 职场文书
人事局接收函
2015/01/30 职场文书
2016年大学生寒假社会实践心得体会
2015/10/09 职场文书
看古人们是如何赞美老师的?
2019/07/08 职场文书
Python 如何实现文件自动去重
2021/06/02 Python
CSS作用域(样式分割)的使用汇总
2021/11/07 HTML / CSS
windows server2008 开启端口的实现方法
2022/06/25 Servers
二维码条形码生成的JavaScript脚本库
2022/07/07 Javascript