【问题标题】:can't encode character '\u0144' even using encoding=utf-8 in python3即使在 python3 中使用 encoding=utf-8 也无法编码字符 '\u0144'
【发布时间】:2021-08-28 01:24:50
【问题描述】:

我正在尝试从一些.txt 文件中读取一些信息,它们都是英文的,并且没有任何其他 unicode 字符,问题是对于特定文件它刚刚崩溃并且不显示信息,错误是

Traceback (most recent call last):
  File "C:\users\bienvenido\desktop\programmacion\harvard\cs50 artificial inteligence\6\questions\questions.py", line 107, in <module>
    main()
  File "C:\users\bienvenido\desktop\programmacion\harvard\cs50 artificial inteligence\6\questions\questions.py", line 16, in main
    files = load_files(sys.argv[1])
  File "C:\users\bienvenido\desktop\programmacion\harvard\cs50 artificial inteligence\6\questions\questions.py", line 59, in load_files
    files[file] = f.read()
  File "C:\Users\BIENVENIDO\AppData\Local\Programs\Python\Python39\lib\encodings\cp1252.py", line 23, in decode
    return codecs.charmap_decode(input,self.errors,decoding_table)[0]
UnicodeDecodeError: 'charmap' codec can't decode byte 0x9d in position 38619: character maps to <undefined>

而我正在做的是

with open(os.path.join(directory,file), encoding='utf-8') as f:
    files[file] = f.read()
    print(files[file])

我也试过utf16default编码

【问题讨论】:

  • 首先你可以print(file)查看哪个文件有问题并在普通编辑器中打开它以查看你在文件中的内容。当我运行print('\u0144') 然后我得到ń 这不是英文字符 - 它是波兰字符。
  • 顺便说一句:您应该检查read()print() 是否有问题-有时在Windows 中print() 尝试使用latin1cp1250 对文本进行编码,但它有问题显示utf-8
  • 总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是截图,不是链接到外部门户)有问题(不是评论)。还有其他有用的信息。
  • 创建一个minimal reproducible example。提供最少的文件内容(及其编码)和最少的代码来产生您看到的真正错误。您所展示的内容不可重现。显然'\u0144'.encode('utf8') 有效,所以问题标题也不能代表问题。由于它是编码(而非解码)错误,因此可能的原因是 print 指向未配置的终端,但未提供完整的回溯。
  • 最好打印(有问题的)整个错误堆栈,或者至少从您的代码开始)。堆栈中的最后一项(在本例中)位于库中,因此它并不能告诉我们代码中错误发生的位置。

标签: python python-3.x unicode python-unicode txt


【解决方案1】:

您没有使用 UTF-8(不在右侧)。

问题是关于 encode 部分,所以在写入部分(字符串到 二进制数据/编码字符串)。在另一种情况下,您将遇到“无法解码”错误。

所以不是“打开”,而是打印。不是所有的控制台都支持 UTF-8,Python(默认)使用控制台的编码进行标准输出(这很明智。

因此,要检查,而不是打印,只需写入一个临时文件,并检查它是否有效(以及是否有 UTF-8 数据)。我认为是这种情况(但请检查!)。

在这种情况下,您应该检查为什么您的控制台不是 UTF-8。众所周知,Microsoft Windows 是最后一个不使用 UTF-8 的大型操作系统。您可以在此站点中查看如何在各种终端/控制台/电源外壳/工具上启用 UTF-8。但是,当正在运行的用户具有非 UTF-8 语言环境(例如,使用 LANG 环境设置)时,您也可能在其他操作系统中遇到类似的错误。最常见的情况是C(标准语言环境,比 UTF-8 更早,它只使用 ASCII,因为它必须非常标准,它只支持 ASCII)。此语言环境主要由 root 使用,但现代操作系统可能使用 C 的 UTF-8 版本。

【讨论】:

    猜你喜欢
    • 2013-07-24
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 2022-11-12
    相关资源
    最近更新 更多