全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

前言

最近由于项目需要,需要读取一个含有中文的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  # 汉字编码转换  # utf8编码汉字  # 查看汉字编码  # Python运行报错UnicodeDecodeError的解决方法  # 解决pyshp UnicodeDecodeError的问题  # 解决编码问题:UnicodeDecodeError: 'utf-8'&  # 可以通过  # 这篇文章  # 转换成  # 文档  # 是在  # 出了  # 第一个  # 是由  # 两种  # 还不  # 把它  # 我们可以  # 这两个  # 大神  # 第二个  # 还得  # 报错  # 我猜  # 这三个  # 解决办法 


相关文章: 建站之星如何实现五合一智能建站与营销推广?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  如何选择靠谱的建站公司加盟品牌?  如何自定义建站之星模板颜色并下载新样式?  Python如何创建带属性的XML节点  如何零基础在云服务器搭建WordPress站点?  制作网站的过程怎么写,用凡科建站如何制作自己的网站?  网站专业制作公司有哪些,做一个公司网站要多少钱?  如何零成本快速生成个人自助网站?  广州顶尖建站服务:企业官网建设与SEO优化一体化方案  香港服务器如何优化才能显著提升网站加载速度?  建站之星如何助力网站排名飙升?揭秘高效技巧  高防服务器租用首荐平台,企业级优惠套餐快速部署  如何选择服务器才能高效搭建专属网站?  制作网站怎么制作,*游戏网站怎么搭建?  如何在Golang中指定模块版本_使用go.mod控制版本号  山东云建站价格为何差异显著?  焦点电影公司作品,电影焦点结局是什么?  建站主机无法访问?如何排查域名与服务器问题  香港服务器选型指南:免备案配置与高效建站方案解析  简历在线制作网站免费,免费下载个人简历的网站是哪些?  建站主机服务器选购指南:轻量应用与VPS配置解析  制作门户网站的参考文献在哪,小说网站怎么建立?  高性能网站服务器配置指南:安全稳定与高效建站核心方案  公司门户网站制作公司有哪些,怎样使用wordpress制作一个企业网站?  独立制作一个网站多少钱,建立网站需要花多少钱?  如何通过远程VPS快速搭建个人网站?  哈尔滨网站建设策划,哈尔滨电工证查询网站?  网站好制作吗知乎,网站开发好学吗?有什么技巧?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  高端网站建设与定制开发一站式解决方案 中企动力  建站IDE高效指南:快速搭建+SEO优化+自适应模板全解析  北京网站制作公司哪家好一点,北京租房网站有哪些?  如何在阿里云虚拟主机上快速搭建个人网站?  建站之星备案流程有哪些注意事项?  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  义乌企业网站制作公司,请问义乌比较好的批发小商品的网站是什么?  宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?  如何高效利用亚马逊云主机搭建企业网站?  盘锦网站制作公司,盘锦大洼有多少5G网站?  广州营销型建站服务商推荐:技术优势与SEO优化解析  公众号网站制作网页,微信公众号怎么制作?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  建站主机如何选?性能与价格怎样平衡?  C++中的Pimpl idiom是什么,有什么好处?(隐藏实现)  学校免费自助建站系统:智能生成+拖拽设计+多端适配  零服务器AI建站解决方案:快速部署与云端平台低成本实践  如何正确选择百度移动适配建站域名?  济南专业网站制作公司,济南信息工程学校怎么样?  手机网站制作与建设方案,手机网站如何建设? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。