Python转码问题的解决方法——illegal multibyte sequence

1.错误提示“UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 305: ordinal not in range(128)”

(1)源代码为:

# coding:utf-8

import pytesseract
from PIL import Image

# tesseract.exe的全路径
pytesseract.pytesseract.tesseract_cmd = r"D:\Python2.7\tesseract\Tesseract-OCR\tesseract.exe"
# 想要打开的文件的全路径
image = Image.open(r"D:\Program\01.png")

text = pytesseract.image_to_string(image)
# text = pytesseract.image_to_string(image, lang="chi_sim")

with open(r"C:\Users\HuangQi\Desktop\01.txt", "w") as fp:
    fp.write(text.decode("utf-8", "ignore"))
    print text

(2)出现的错误提示为:

D:\Python2.7\python.exe D:/PyCharm/dytt_spider/text.py
Traceback (most recent call last):
  File "D:/PyCharm/dytt_spider/text.py", line 18, in <module>
    fp.write(text.decode("utf-8", "ignore"))
  File "D:\Python2.7\lib\encodings\utf_8.py", line 16, in decode
    return codecs.utf_8_decode(input, errors, True)
UnicodeEncodeError: 'ascii' codec can't encode character u'\u2019' in position 305: ordinal not in range(128)

Process finished with exit code 1

(3)解决方案为:

在.py文件的开头加上如下代码:

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

关于为什么要reload(sys)?

因为这里的import语句可能不是sys的第一次导入语句,可能是第2、3次进行sys模块的import,这里是一个对sys的引用,只能reload才能进行重新加载。

为什么要重新加载,而直接引用过来则不能调用该函数?

因为setdefaultencoding()函数在被系统调用后被删除了(所以如果不重新加载,在Pycharm中显示setdefaultencoding()函数不存在),所以通过import引用进来时其实已经没有了,所以必须reload一次sys模块,这样setdefaultencoding()才会为可用,才能在代码里修改解释器当前的字符编码。

2. 在Python中,可以对String调用decode和encode方法来实现转码。

(1)比如,若要将某个String对象s从gbk内码转换为UTF-8,可以如下操作 
s.decode('gbk').encode('utf-8′) 

可是,在实际开发中,我发现,这种办法经常会出现异常: 

UnicodeDecodeError: ‘gbk' codec can't decode bytes in position 30664-30665: illegal multibyte sequence 
这 是因为遇到了非法字符——尤其是在某些用C/C++编写的程序中,全角空格往往有多种不同的实现方式,比如\xa3\xa0,或者\xa4\x57,这些 字符,看起来都是全角空格,但它们并不是“合法”的全角空格(真正的全角空格是\xa1\xa1),因此在转码的过程中出现了异常。 
这样的问题很让人头疼,因为只要字符串中出现了一个非法字符,整个字符串——有时候,就是整篇文章——就都无法转码。 
(2)解决办法: 
s.decode('gbk', ‘ignore').encode('utf-8′) 
因为decode的函数原型是decode([encoding], [errors='strict']),可以用第二个参数控制错误处理的策略,默认的参数就是strict,代表遇到非法字符时抛出异常; 
如果设置为ignore,则会忽略非法字符; 
如果设置为replace,则会用?取代非法字符; 
如果设置为xmlcharrefreplace,则使用XML的字符引用。 
python文档 
decode( [encoding[, errors]]) 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值