python解决汉字编码问题:Unicode Decode Error


Posted in Python onJanuary 19, 2017

前言

最近由于项目需要,需要读取一个含有中文的txt文档,完了还要保存文件。文档之前是由base64编码,导致所有汉字读取显示乱码。项目组把base64废弃之后,先后出现两个错误:

ascii codec can't encode characters in position ordinal not in range 128
UnicodeDecodeError: ‘utf8' codec can't decode byte 0x。

如果对于ascii、unicode和utf-8还不了解的小伙伴,可以看之前的这篇文章关于字符串和编码

那么必须对下面这三个概念有所了解:

  1. ascii只能表示数字、英文字母和一些特殊符号,不能表示汉字
  2. unicode和utf-8都可以表示汉字,unicode是固定长度,utf-8是可变长度
  3. 内存中存储方式一般为unicode,而磁盘文件存储方式一般为utf-8,因为utf-8可以节约存储空间

那么python的默认编码是什么?

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> sys.getdefaultencoding()
'utf-8'

python的默认编码是ascii,可以通过sys.setdefaultencoding('utf-8')函数设置python的默认编码。

python中可以通过encode和decode的方式改变数据的编码,比如:

>>> u'汉字'
u'\u6c49\u5b57'
>>> u'汉字'.encode('utf-8')
'\xe6\xb1\x89\xe5\xad\x97'
>>> u'汉字'.encode('utf-8').decode('utf-8')
u'\u6c49\u5b57'

我们可以通过这两个函数设置编码。

那么,python中的str是什么类型?

>>> import binascii
>>> '汉字'
'\xba\xba\xd7\xd6'
>>> type('汉字')
<type 'str'>
>>> print binascii.b2a_hex('汉字')
babad7d6
>>> print binascii.b2a_hex(u'汉字')
Traceback (most recent call last):
 File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec can't encode characters in
position 0-1: ordinal not in range(128)
>>> print binascii.b2a_hex(u'汉字'.encode('utf-8'))
e6b189e5ad97
>>> print binascii.b2a_hex(u'汉字'.encode('gbk'))
babad7d6

binascii是将数据的二进制转换成ascii,上面的解释是:‘汉字'的类型是str,二进制是babad7d6,u‘汉字'是无法转换成ascii,这样就报出了开头的第一个错误。解决办法就是把它.encode(‘utf-8')成str类型。因为我命令行是windows默认的GBK编码,所有u'汉字'.encode(‘gbk')的时候,输出结果和‘汉字'结果一样。

总结一下,python的str实际上是unicode的一种,python的默认编码是ascii,对于非ascii转成ascii的时候都会报错,牢记下面的规则:

  1. unicode => encode(‘合适的编码') => str
  2. str => decode(‘合适的编码') => unicode

还有一种简单的方式,就是在文件头设置编码,可以省去很多麻烦:

import sys
reloads(sys)
sys.setdefaultencoding('utf-8')

对于第二个问题,是在文件读取的时候出的错。utf-8的文件有bom和无bom两种方式,两者的差别好像在bom文件比无bom文件多了一个头,导致以utf-8方式读文件时报错,我先前曾尝试读文件的时候先对有无bom进行判断,跳过bom文件的头,后来失败了,真尴尬~~。

还得上google求助大神,具体的操作方法就是使用codecs库来读文件(我猜这个库就是对文件的头进行检测)。

import codecs
codecs.open(file_name, "r",encoding='utf-8', errors='ignore')

对于编码问题,一定要懂得ascii、unicode和utf-8工作原理。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流。

Python 相关文章推荐
Python字符串的encode与decode研究心得乱码问题解决方法
Mar 23 Python
Python实现的多线程端口扫描工具分享
Jan 21 Python
用Python解决计数原理问题的方法
Aug 04 Python
使用Django Form解决表单数据无法动态刷新的两种方法
Jul 14 Python
深入分析python中整型不会溢出问题
Jun 18 Python
pygame实现简易飞机大战
Sep 11 Python
django 类视图的使用方法详解
Jul 24 Python
PyQt5基本控件使用之消息弹出、用户输入、文件对话框的使用方法
Aug 06 Python
python数组循环处理方法
Aug 26 Python
Python实现桌面翻译工具【新手必学】
Feb 12 Python
解决Python spyder显示不全df列和行的问题
Apr 20 Python
IntelliJ 中配置 Anaconda的过程图解
Jun 01 Python
Python 3.x 连接数据库示例(pymysql 方式)
Jan 19 #Python
Python爬取网易云音乐上评论火爆的歌曲
Jan 19 #Python
一步步教你用Python实现2048小游戏
Jan 19 #Python
python 开发的三种运行模式详细介绍
Jan 18 #Python
Python 3中的yield from语法详解
Jan 18 #Python
Python中的字符串操作和编码Unicode详解
Jan 18 #Python
关于Python中异常(Exception)的汇总
Jan 18 #Python
You might like
php中对xml读取的相关函数的介绍一
2008/06/05 PHP
基于PHP+Ajax实现表单验证的详解
2013/06/25 PHP
PHP数据库连接mysql与mysqli对比分析
2016/01/04 PHP
使用php实现网站验证码功能【推荐】
2017/02/09 PHP
Javascript动态绑定事件的简单实现代码
2010/12/25 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
jQuery实现Twitter的自动文字补齐特效
2014/11/28 Javascript
JavaScript中实现sprintf、printf函数
2015/01/27 Javascript
浅谈Jquery为元素绑定事件
2015/04/27 Javascript
基于JS实现类似支付宝支付密码输入框
2016/09/02 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
设置cookie指定时间失效(实例代码)
2017/05/28 Javascript
JS获取填报扩展单元格控件的值的解决办法
2017/07/14 Javascript
Vue递归组件+Vuex开发树形组件Tree--递归组件的简单实现
2019/04/01 Javascript
Element Rate 评分的使用方法
2020/07/27 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
Python中的is和==比较两个对象的两种方法
2017/09/06 Python
基于windows下pip安装python模块时报错总结
2018/06/12 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
jupyter实现重新加载模块
2020/04/16 Python
详解python 支持向量机(SVM)算法
2020/09/18 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
英国景点门票网站:attractiontix
2019/08/27 全球购物
俄罗斯茶和咖啡网上商店:Tea.ru
2021/01/26 全球购物
怎样在程序里获得一个空指针
2015/01/24 面试题
外贸英语毕业生自荐信
2013/11/14 职场文书
财会自我鉴定范文
2013/12/27 职场文书
博士毕业生自我鉴定范文
2014/04/13 职场文书
残疾人小组计划书
2014/04/27 职场文书
社会工作专业自荐信
2014/09/26 职场文书
校园广播站开场白
2015/06/01 职场文书
学习十八大的感悟
2015/08/11 职场文书
《平行四边形的面积》教学反思
2016/02/16 职场文书
《去年的树》教学反思
2016/02/18 职场文书
python使用opencv对图像添加噪声(高斯/椒盐/泊松/斑点)
2022/04/06 Python
Python使用openpyxl模块处理Excel文件
2022/06/05 Python