文档章节

Python中遇到"UnicodeDecodeError类的编码或解码的错误时如何处理

巴鲁
 巴鲁
发布于 2015/04/20 10:14
字数 1519
阅读 171
收藏 0

【背景】

问题参见:

python2.7 urllib2 抓取新浪乱码

中的:

报错的异常是   
UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

此问题,还是很具有代表性的,此处,专门整理如下:

【Python中如何处理UnicodeDecodeError和UnicodeEncodeError】

简答:

1.仔细分析错误的类型

2.搞清自己处理的字符串是什么类型的

3.然后换用这种的字符编码去编码或解码

详解:

以上面的错误:

UnicodeDecodeError: ‘gbk’ codec can’t decode bytes in position 2-3: illegal multibyte sequence

为例,去解释,如何处理这类问题:

1.仔细分析错误的类型

(1)错误是Unicode的编码还是解码

对于此处,错误是:

UnicodeDecodeError

的类型的。

此英文,对应的中文的含义,其实已经很清楚了:

Unicode的解码(Decode)出现错误(Error)了

而对于上面这句,我们可以推断出:

  • 你当前正在处理某种编码类型的字符串
  • 此处你要处理字符串,是想要将该字符串去解码decode,变成Unicode
  • 但是将该字符串解码变成Unicode期间,却出错了

(2)所用的是何种编码

好的,接着看上面的错误:

‘gbk’ codec can’t decode

使得错误信息更加明显了:

  • 你此处,要将字符串解码为Unicode,是以gbk编码的方式去解码(该字符串变成Unicode)的
  • 但是此处通过gbk的方式,却无法解码(can’t decode )
  • 注:此处的codec,意思是:编解码(器),是Python内部的模块,用来编码或解码(字符串)的

(3)错误位置

bytes in position 2-3

此处的信息,后续一般也很少用到。

有时候会用于定位具体错误的位置。

此处暂且忽略。

(4)错误的细节错误类型

illegal multibyte sequence

翻译为中文为:

非法的,多字节,序列

简单说就是:

没法(解码)了。

【原因及解决办法】

好了,针对于上面所分析出来的信息:

将一个字符串,通过gbk的方式,去解码,想要获得Unicode字符串,结果出错了

我们来说说原因和解决办法:

此种错误,有几种可能: 
(1)要处理的字符串本身不是gbk编码,但是你却以gbk编码去解码 
比如,字符串本身是utf-8的,但是你却用gbk去解码utf-8的字符串,所以结果不用说,则必然出错

则必然会出现这类的错误,说是,用gbk的方式去解码字符串,想要获得Unicode字符串,但是结果却解码出错了

解决办法:

如果你确定当前字符串,比如抓取网页通过charset=utf-8,已经确定html的字符串是utf-8的,

则可以直接去通过utf-8去解码。

相关参考内容:

详解抓取网站,模拟登陆,抓取动态网页的原理和实现(Python,C#等)

中的:

【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释

而如果本身对于所处理的字符串,不太清楚是什么编码类型的,可以尝试去通过chardet等模块,去检测看看:

【教程】如何用Python中的chardet去检测字符编码类型

然后搞清楚了,确定了,字符串是什么类型,然后再去解码。

提示:

关于字符串编码的类型,作为背景学习知识,也应该去了解一下。

这样对于以后处理字符串方面,会更有帮助。

(2)你没有主动的去将字符串编码为对应的Unicode,但是结果也报上面的UnicodeDecodeError的错误

这个情况,最常见的,就是我之前在:

【总结】Python 2.x中常见字符编码和解码方面的错误及其解决办法

所整理过的:

“Python中,打印字符串时,字符串本身的编码,与输出终端中所用编码不匹配”

此处不再赘述,只简要再说一下:

如果你本身拿到的是utf-8等,非gbk编码的字符串,然后用print去打印出来

在windows系统就是输出到cmd中

而cmd中,(对于多数中国人所用的是中文的系统)默认字符编码是gbk

从而导致此种现象:

python要将utf-8编码的字符串,在gbk的cmd的中打印出来

所以先要去尝试,用gbk的编码,解码为Unicode然后再打印出来

结果就出现此处的错误了。

详细解释,还是参见上面的教程。

其中还有示例代码的。

(3)处理的字符的确是gbk的,但是其中夹杂的部分特殊字符,是gbk编码中所没有的 
如果有些特殊字符是GB18030中有的,但是是gbk中没有的。 
则用gbk去解码,去所不支持的字符,也比如会出错。 
所以,此种情况,可以尝试用和当前编码(gbk)所兼容的但所包含字符更多的编码(gb18030)去解码,或许就可以了。

提示:

如果对于GBK,GB18030,以及GB2312不了解,则可参考:

字符编码简明教程

另外:

如果遇到其他的,类似此中错误的,比如:

UnicodeEncodeError: 'gbk' codec can't encode character u'\u3232' in position 0: illegal multibyte sequence

等类型的错误,你就可以按照上述的思路,去分析,错误的现象,原因,然后通过自己,就可以找到解决办法了。

注:

其他和这类错误相关的,也还有一些可以参考的:

【总结】静态网页抓取,动态网页抓取,模拟登陆的注意事项和心得

中的:“返回的html内容是乱码”

本文转载自:http://www.tuicool.com/articles/nEjiEv

巴鲁
粉丝 8
博文 23
码字总数 12631
作品 0
本溪
程序员
私信 提问
Python2.x 字符编码终极指南

在人机交互之字符编码 一文中对字符编码进行了详细的讨论,并通过一些简单的小程序验证了我们对于字符编码的认识。但仅了解这篇文章的内容,并不能帮我们在日常编程中躲过一些字符编码相关的...

selfboot
2016/12/29
0
0
详解 python 中文编码与处理

注意:本文只是针对 python 2,在 python 3 中,编码方式与处理技巧有些许变化,具体请参考: Python 2 与 Python 3 的差异对比: http://my.oschina.net/leejun2005/blog/173553 一、使用中...

大数据之路
2012/08/24
34.6K
0
也谈 Python 的中文编码处理

最近业务中需要用 Python 写一些脚本。尽管脚本的交互只是命令行 + 日志输出,但是为了让界面友好些,我还是决定用中文输出日志信息。 很快,我就遇到了异常: Python代码 UnicodeEncodeErr...

我的去哈哈
2014/02/12
718
0
Python 编码为什么那么蛋疼?

据说,每个做 Python 开发的都被字符编码的问题搞晕过,最常见的错误就是 UnicodeEncodeError、UnicodeDecodeError,你好像知道怎么解决,遗憾的是,错误又出现在其它地方,问题总是重蹈覆辙...

刘志军
2017/03/22
0
0
Python Unicode与中文处理(转)

Python Unicode与中文处理 python中的unicode是让人很困惑、比较难以理解的问题,本文力求彻底解决这些问题; 1.unicode、gbk、gb2312、utf-8的关系; http://www.pythonclub.org/python-bas...

coldlemon
2014/01/04
298
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot + Mybatis-Plus 集成与使用(二)

前言: 本章节介绍MyBatis-Puls的CRUD使用。在开始之前,先简单讲解下上章节关于Spring Boot是如何自动配置MyBatis-Plus。 一、自动配置 当Spring Boot应用从主方法main()启动后,首先加载S...

伴学编程
今天
7
0
用最通俗的方法讲spring [一] ──── AOP

@[TOC](用最通俗的方法讲spring [一] ──── AOP) 写这个系列的目的(可以跳过不看) 自己写这个系列的目的,是因为自己是个比较笨的人,我曾一度怀疑自己的智商不适合干编程这个行业.因为在我...

小贼贼子
今天
6
0
Flutter系列之在 macOS 上安装和配置 Flutter 开发环境

本文为Flutter开发环境在macOS下安装全过程: 一、系统配置要求 想要安装并运行 Flutter,你的开发环境需要最低满足以下要求: 操作系统:macOS(64位) 磁盘空间:700 MB(不包含 IDE 或其余...

過愙
今天
6
0
OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.5K
16
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
42
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部