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]])