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 相关文章推荐
paramiko模块安装和使用(远程登录服务器)
Jan 27 Python
Python开发的单词频率统计工具wordsworth使用方法
Jun 25 Python
详解Python之数据序列化(json、pickle、shelve)
Mar 30 Python
Python中模块pymysql查询结果后如何获取字段列表
Jun 05 Python
Python实现重建二叉树的三种方法详解
Jun 23 Python
python Flask 装饰器顺序问题解决
Aug 08 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
Jul 22 Python
利用pandas将非数值数据转换成数值的方式
Dec 18 Python
python shell命令行中import多层目录下的模块操作
Mar 09 Python
通过实例简单了解Python sys.argv[]使用方法
Aug 04 Python
pandas apply多线程实现代码
Aug 17 Python
python实现登录与注册系统
Nov 30 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 cout&amp;lt;&amp;lt;的一点看法
2010/01/24 PHP
smarty内置函数{loteral}、{ldelim}和{rdelim}用法实例
2015/01/22 PHP
phpstudy后门rce批量利用脚本的实现
2019/12/12 PHP
背景音乐每次刷新都可以自动更换
2007/02/01 Javascript
JSON.parse 解析字符串出错的解决方法
2010/07/08 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
jQuery ui 利用 datepicker插件实现开始日期(minDate)和结束日期(maxDate)
2014/05/22 Javascript
jquery幻灯片插件bxslider样式改进实例
2014/10/15 Javascript
js输出数据精确到小数点后n位代码
2016/07/02 Javascript
JS实现输入框提示文字点击时消失效果
2016/07/19 Javascript
jQuery购物网页经典制作案例
2016/08/19 Javascript
解析javascript图片懒加载与预加载的分析总结
2016/10/27 Javascript
vue 2.0路由之路由嵌套示例详解
2017/05/08 Javascript
最常用的jQuery表单验证(简单)
2017/05/23 jQuery
基于jQuery实现手风琴菜单、层级菜单、置顶菜单、无缝滚动效果
2017/07/20 jQuery
vue mintui-Loadmore结合实现下拉刷新和上拉加载示例
2017/10/12 Javascript
Vue表单及表单绑定方法
2018/09/04 Javascript
vue中接口域名配置为全局变量的实现方法
2018/09/20 Javascript
[52:05]EG vs OG 2019国际邀请赛小组赛 BO2 第二场 8.16
2019/08/18 DOTA
深入理解Python中各种方法的运作原理
2015/06/15 Python
Python实现多线程抓取网页功能实例详解
2017/06/08 Python
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
Python反射和内置方法重写操作详解
2018/08/27 Python
python调用c++传递数组的实例
2019/02/13 Python
Pytorch修改ResNet模型全连接层进行直接训练实例
2019/09/10 Python
python栈的基本定义与使用方法示例【初始化、赋值、入栈、出栈等】
2019/10/24 Python
tensorflow的计算图总结
2020/01/12 Python
python连接mongodb集群方法详解
2020/02/13 Python
python中对二维列表中一维列表的调用方法
2020/06/07 Python
英国最大的女性服装零售商:Dorothy Perkins
2017/03/30 全球购物
楼面部长岗位职责范本
2014/02/14 职场文书
2014年政府采购工作总结
2014/12/09 职场文书
学校捐书活动总结
2015/05/08 职场文书
致短跑运动员加油稿
2015/07/21 职场文书
Pygame Draw绘图函数的具体使用
2021/11/17 Python