Tesseract提取特殊字符文本终端打印报ASCII编码错误求解决方案
这个问题的核心原因是:虽然你的Python代码已经正确处理了UTF-8编码,但Docker容器内的终端输出编码没有正确设置为UTF-8,导致print()尝试用ASCII编码输出包含法语特殊字符(é、è、à、ç等)的字符串时失败。写入文件时你显式指定了encoding='utf-8',所以能正常保存,但终端输出环节的编码不匹配引发了报错。
下面给你几个可行的解决方案,按从代码层面到环境配置的顺序排列:
方案一:在Python代码中强制设置stdout编码(无需修改容器环境)
针对Python 3.6(你当前的版本),可以用codecs模块重新包装标准输出流,强制它使用UTF-8编码:
# -*- coding: utf-8 -*- import cv2 import pytesseract import sys import codecs # 强制stdout使用UTF-8编码 sys.stdout = codecs.getwriter('utf-8')(sys.stdout.detach()) with open('path_to_text_file', 'w', encoding='utf-8') as f: try: im = cv2.imread(path_to_image) text = pytesseract.image_to_string(im, lang='fra') f.write(text + '\n') print(text) except Exception as e: print(e) # 提示:with语句会自动关闭文件,这里不需要手动执行f.close()
说明:Python 3.7及以上版本可以用更简洁的
sys.stdout.reconfigure(encoding='utf-8'),但3.6不支持这个方法,所以采用上述codecs方案。
方案二:修改Docker容器的Locale配置(从环境根源解决)
Docker默认的Locale是C(ASCII编码),你可以通过Dockerfile或者启动命令修改容器的Locale为UTF-8:
方法1:在Dockerfile中添加Locale配置
# 基于你的基础镜像,比如ubuntu:18.04 FROM ubuntu:18.04 # 安装locale工具并生成UTF-8 locale RUN apt-get update && apt-get install -y locales && \ locale-gen fr_FR.UTF-8 && \ rm -rf /var/lib/apt/lists/* # 设置环境变量指定默认Locale ENV LANG fr_FR.UTF-8 ENV LC_ALL fr_FR.UTF-8
重新构建镜像后,容器内的终端默认编码就是UTF-8,Python的print()就能正常输出特殊字符了。
方法2:启动容器时临时指定Locale环境变量
如果不想修改Dockerfile,可以在启动容器时通过-e参数传入Locale变量:
docker run -e LANG=fr_FR.UTF-8 -e LC_ALL=fr_FR.UTF-8 your-image-name
方案三:临时编码转换后打印(快速测试用)
如果只是临时测试,不想修改代码或容器配置,可以把字符串编码为UTF-8字节后再输出:
# 替换原有的print(text)为: import sys sys.stdout.buffer.write(text.encode('utf-8') + b'\n')
这个方法绕过了Python的字符串编码环节,直接把UTF-8字节写入终端输出流,只要你的本地终端支持UTF-8就能正常显示。
验证你的环境
你可以先在Python中打印当前标准输出的编码,确认问题所在:
import sys print(sys.stdout.encoding)
如果输出是ASCII,那就能确认是终端输出编码的问题,用上面的方案解决即可。
内容的提问来源于stack exchange,提问作者singrium

