【问题标题】:'ascii' codec can't encode character '\xc9' in position 9: ordinal not in range(128)“ascii”编解码器无法在位置 9 编码字符“\xc9”:序数不在范围内(128)
【发布时间】:2019-07-13 00:44:48
【问题描述】:

我有一个使用 Tesseract 从图像中提取的文本。当我尝试在终端中打印它时,如果出现特殊字符(é、è、à、ç ...),我会收到此错误'ascii' codec can't encode character '\xc7' in position 10: ordinal not in range(128) 当我将提取的文本写入文件时,我得到了正确的文本,包括特殊字符!
这是我使用的代码:

# -*- coding: utf-8 -*-
import cv2
import pytesseract
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)
f.close()

我也尝试了print(str(text)) 而不是print(text),但没有任何改变!
如果有帮助,当我打印变量 text (print(type(text))) 的类型时,我会得到 <class 'str'>。 任何想法如何解决这个错误?

编辑:

我正在处理的文件示例(不要担心机密性,此示例来自互联网)

我使用 Ubuntu 18.04,python 3.6
我运行的项目在 docker 上。

EDIT2:
终端显示的输出:

'ascii' codec can't encode character '\xc9' in position 1: ordinal not in range(128)
'ascii' codec can't encode character '\xc9' in position 12: ordinal not in range(128)
'ascii' codec can't encode character '\xe9' in position 10: ordinal not in range(128)
30 | Noms BERTHIER
'ascii' codec can't encode character '\xe9' in position 2: ordinal not in range(128)
'ascii' codec can't encode character '\u2026' in position 0: ordinal not in range(128)
Sexe
Sexe: L N
3: PARIS 1ER (75)
ETES
Taie : 170
Cruise Her
| Signature
Le pol
du titulaire :
IDFRABERTHIFR<<EK<KEKKKELELEREREELEREE
88069231028S8CORINNE<<<<<<<6512068F6  

输出写入文本文件:

法国共和国
重新
D'IDENTITÉ Ne : 880692310285
法兰西民族
30 |名词 BERTHIER
Prénoms): CORINNE
… Néfel le: 06.12.1985

性别:L N
3:巴黎 1ER (75)
ETES
太乙:170
巡航她
|签名
波尔
职称 :
IDFRABERTHIFR

EDIT3:
如果我从with open(filename, 'w') .. 中删除encoding='utf-8',我只会得到普通字符;有特殊字符的每一行都不再写入文件。 python i/o 编码是 utf-8 locale -a 的输出是 C C.UTF-8 POSIX

【问题讨论】:

  • 您在 Windows 上吗?什么是 Python 的 I/O 编码以及您的系统设置使用什么代码页?另请参阅the Stack Overflow character-encoding tag info page,了解有关如何提出更明确的问题的疑难解答提示和建议
  • 编辑根本没有帮助。您尝试输出的 text 很有趣(Python 尝试输出的实际 Unicode 或字节)。
  • 哦!抱歉,我没听懂,我会再次编辑问题,添加写入文件的输出和终端中显示的输出
  • locale 的输出,可能会被精简以省略冗余信息(我们不关心排序顺序或货币设置,所以实际上可能只是 LC_CTYPELANG 以及可能是 @987654338 @如果它不同于LC_CTYPE)
  • 不是locale -a,只是locale。如果您的语言环境是 CPOSIX,请尝试将其设置为 C.UTF-8

标签: python-3.x docker encoding character-encoding python-3.6


【解决方案1】:

正如@triplee 所说,问题在于locale 编码:它被设置为POSIX。因此,正如他所建议的那样,这个想法是将语言环境设置为 utf-8,例如使用 locale-gen fr_FR.UTF-8
由于我正在运行的项目是在 Docker 上,因此我必须将这些更改写入 Dockerfile-dev。
幸运的是,我在 Docker 上发现了 a similar question 的相同问题。所以这是我添加到我的 Dockerfile-dev 以将语言环境设置为 utf-8 的内容:

RUN apt-get -qq update && \
    apt-get -q -y upgrade && \
    apt-get install -y sudo curl wget locales && \
    rm -rf /var/lib/apt/lists/*

# Ensure that we always use UTF-8 and with French locale
RUN locale-gen fr_FR.UTF-8


RUN chmod 0755 /etc/default/locale

ENV LC_ALL=fr_FR.UTF-8
ENV LANG=fr_FR.UTF-8
ENV LANGUAGE=fr_FR.UTF-8

保存到 Dockerfile-dev 后,我运行 docker-compose builddocker-compose up

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-29
    • 2013-10-14
    • 2019-11-10
    • 2021-05-14
    • 2023-03-03
    • 1970-01-01
    • 2018-03-10
    • 2011-01-31
    相关资源
    最近更新 更多