【已解决】UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib

转载 2017年01月03日 17:47:18

今天碰到同样的问题,各种找资料,只有这篇文章帮我解决掉了,谢谢原作者!

python27下的编码就是坑爹啊!!

【问题】

python中已获取网页:

http://blog.csdn.net/hfahe/article/details/5494895

的html源码,其时UTF-8编码的。

提取出其标题部分:

?
1
2
3
4
5
<span class="link_title"><a href="/hfahe/article/details/5494895">
 
在2008 Beijing Perl 大会的演讲-使用Mason开发高性能的Web站点‎
 
</a></span>

中的标题文字:

在2008 Beijing Perl 大会的演讲-使用Mason开发高性能的Web站点

然后用:

titleUni = unicode(titleHtml, “UTF-8”);

titleUni = titleHtml.decode(“UTF-8”);

将其解码成Unicode,但是却会出错:

UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multibyte sequence

 

【解决过程】

1.Python的编码问题,GB18030,UTF-8,Unicode等问题,之前遇到过很多次了,也就解决了。此处很奇怪的是,

类似的其他的网页,比如:

http://blog.csdn.net/v_july_v/article/details/6543438

http://blog.csdn.net/v_july_v/article/details/5934051

等,对应提取出来的内容,都是可以正常解码为Unicode的。

因为本身其编码的确是Utf-8的。

2.去试了试用chardet.detect分析其真正编码的,得到的结果是:

encInfo= {‘confidence’: 0.99, ‘encoding’: ‘utf-8’}

也是和其他网页内容得到的结果是一样的。

3.此问题觉得很诡异的是,本身调用UTF-8去decode,但是解码出错却提示的是GBK的,而不是UTF-8相关解码出错。

4.找了些其他帖子:

Python UnicodeEncodeError:illegal multibyte sequence

但是讨论的都是关于从Unicode编码为GBK或GB2312,然后出错的。

而我这里的错误是,本身内容是UTF-8的,然后想要还原为Unicode,结果却提示GBK解码错误的。。。

5.这里:探索UTF-8中文编码的BOM标记问题提到了,可能是由于UTF-8的BOM造成的不能正常解码,所以试着去将返回的html导出为html文件,然后用Notepad++查看,结果还是没看出是否有BOM,反正是文字内容,都可以查看到的。

然后也试了类似代码:

titleUni = titleHtml[1:].decode(“UTF-8”);

titleUni = titleHtml[2:].decode(“UTF-8”);

但是都还是不行。

后来在这里也看到了,关于UTF-8的BOM的问题的解释,但同样不是我要的。

6.在这里:Python Unicode与中文处理(文摘),看到了:

s.decode(‘gbk’, ‘ignore’).encode(‘utf-8′)

然后才想起来,之前是看到过类似的解释,即添加ignore来忽略非法的字符,然后又参考:

python字符串decode中遇到非法字符的问题

然后去找了对应语法:

str.decode([encoding[, errors]])

Decodes the string using the codec registered for encodingencoding defaults to the default string encoding. errors may be given to set a different error handling scheme. The default is 'strict', meaning that encoding errors raiseUnicodeError. Other possible values are 'ignore''replace' and any other name registered via codecs.register_error(), see section Codec Base Classes.

New in version 2.2.

Changed in version 2.3: Support for other error handling schemes added.

Changed in version 2.7: Support for keyword arguments added.

试了:

titleUni = titleHtml.decode(“UTF-8”, ‘ignore’);

和:

titleUni = titleHtml.decode(“UTF-8”, ‘replace’);

但是结果仍是:

print “titleUni=”,titleUni;

会出现上述“’gbk’ codec can’t encode”的错误。

但是后来无意间发现,在打印titleUni之前,添加了一行调试代码:

print “len(titleUni)=”,len(titleUni);

却是可以正常打印的,这就说明,此处的titleUni变量,正常解码为Unicode的值了,即上述decode是正常的。

然后又重新试了试,之前的:

titleUni = titleHtml.decode(“UTF-8”);

结果也是一样的,即print “len(titleUni)=”,len(titleUni);也是可以正常输出的。

然后此时才明白,原来出现’gbk’ codec can’t encode”的错误的根本原因是,对于前面的,不论是用

titleHtml.decode(“UTF-8”);

还是

titleHtml.decode(“UTF-8”, ‘ignore’);

还是

titleHtml.decode(“UTF-8”, ‘replace’);

都是可以得到正常的titleUni的Unicode字符的,然后对于此Unicode的字符,需要print出来的话,由于本地系统是Win7中的cmd,默认codepage是CP936,即GBK的编码,所以需要先将上述的Unicode的titleUni先编码为GBK,然后再在cmd中显示出来,然后由于titleUni中包含一些GBK中无法显示的字符,导致此时提示“’gbk’ codec can’t encode”的错误的。

【总结】

对于此(类)问题:

(1)出现UnicodeEncodeError –> 说明是Unicode编码时候的问题;

(2) ‘gbk’ codec can’t encode character –> 说明是将Unicode字符编码为GBK时候出现的问题;

此时,往往最大的可能就是,本身Unicode类型的字符中,包含了一些无法转换为GBK编码的一些字符。

解决办法是:

  • 方案1:

在对unicode字符编码时,添加ignore参数,忽略无法无法编码的字符,这样就可以正常编码为GBK了。

对应代码为:

gbkTypeStr = unicodeTypeStr.encode(“GBK“, ‘ignore’);
  • 方案2:

或者,将其转换为GBK编码的超集GB18030 (即,GBK是GB18030的子集):

gb18030TypeStr = unicodeTypeStr.encode(“GB18030“);

对应的得到的字符是GB18030的编码。

【题外话】

对于上述中,将原先的utf-8的字符转换为Unicode的时候,其实更加安全的做法,也可以将:

titleUni = titleHtml.decode(“UTF-8”);

替换为:

titleUni = titleHtml.decode(“UTF-8”, ‘ignore’);

这样可以实现,即使对于那些,相对来说是无关紧要的一些特殊字符,也可以成功编码,避免编码出错,提高程序的健壮性。

 


【后记 2012-12-01】

后来,专门花精力,总结了最常见的一些类型,感兴趣的可以去看看:

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

Tensorflow 填坑日记

坑一、UnicodeEncodeError: 'utf-8' codec can't encode character '\udcce' in position 1936: surrogates no...
  • ChenLuLiang
  • ChenLuLiang
  • 2017年12月15日 15:09
  • 203

Python字符串的encode与decode研究心得乱码问题解决方法

为什么Python使用过程中会出现各式各样的乱码问题,明明是中文字符却显示成“\xe4\xb8\xad\xe6\x96\x87”的形式? 为什么会报错“UnicodeEncodeError: '...
  • shjh369
  • shjh369
  • 2015年11月10日 17:39
  • 168

Git 学习笔记

rm -rf 文件夹 若文件夹中有内容,应该这个样子rm dir 若文件夹中是空的 git init 初始化,必须在 git add 之前添加 cat ~/.gitconfig 可以查看git 中...
  • lovezbs
  • lovezbs
  • 2015年06月14日 18:10
  • 2922

Python爬虫起步:一步步解决中文乱码显示

一步步改进代码到成功抓取NGA代码的过程。
  • hxldxx99
  • hxldxx99
  • 2015年10月06日 16:47
  • 1613

PYTHON-进阶-编码处理小结

Python-进阶-编码处理小结 开始首先str 和 unicode文件处理,IDE和控制台建议相关模块及一些方法 整理下python编码相关的内容 注意: 以下讨论为P...
  • jinruoyanxu
  • jinruoyanxu
  • 2016年04月12日 15:42
  • 779

innobackupex 备份时utf8mb4编码的mysql数据库失败

现象: 备份时出现如下错误: [root@UHDEV014 wxc]# innobackupex --defaults-file=/etc/my_new.cnf --user=root --pas...
  • wxc20062006
  • wxc20062006
  • 2017年01月13日 14:51
  • 511

最容易读进去的深度学习科普贴

今天发现这一篇文章,感觉总结的很好,故转载过来,原文地址:http://www.cnblogs.com/tsiangleo/p/5450466.html—————(一)—————–一2016 年一月底...
  • ghui23
  • ghui23
  • 2016年07月24日 11:35
  • 2067

Python中的编码

1. Python源码文件的编码Python源码文件的编码格式决定了在该源文件中声明的字符串(str和unicode)的编码格式,例如py源码如下:#!/usr/bin/env python # co...
  • liuxingen
  • liuxingen
  • 2015年10月18日 16:47
  • 9684

在打包项目时出现java:1: illegal character: \65279问题的解决方法

这个是一个诡异的问题,主要是由于文件的的编码格式所引起的,在用eclipse开发项目的时候这个问题是不会报任何错误的,而且我给测试部的大的war包的时候也没有问题。就是在最后在Linux下打包工具打包...
  • zls_12
  • zls_12
  • 2013年10月21日 16:20
  • 2360

Scrapy爬虫框架抓取中文结果为Unicode编码,如何转换UTF-8编码的解决办法

1.在pipelines.py中设置如下:(t.json为你要保存的文件名) 2.在settings.py中设置如下: 3.在终端运行爬虫程序  scrapy crawl   XX(爬虫名...
  • yjw19901214
  • yjw19901214
  • 2016年10月21日 18:50
  • 945
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【已解决】UnicodeEncodeError: ‘gbk’ codec can’t encode character u’\u200e’ in position 43: illegal multib
举报原因:
原因补充:

(最多只允许输入30个字)