【问题标题】:Why does python's open() function mangle my utf-8 files?为什么 python 的 open() 函数会破坏我的 utf-8 文件?
【发布时间】:2021-10-20 11:32:46
【问题描述】:

这是一个奇怪的问题,可能是由于 python 更新,因为它昨天运行良好,没有任何变化。我们开始:

我有一个程序可以打开 utf-8 文件(使用重音字符等,而不仅仅是 ansi 字符)。当我使用 open(file, encoding="utf-8-sig").read() 打开文件时,非 ansi 字符会被破坏,如下所示在我的终端中:

mangled characters when encoding of open() is set to "utf-8-sig"

但是,当我将编码设置为"ansi" 时,字符完全正常!

normal characters with encoding="ansi"

这对我来说完全是个谜。如前所述,昨天工作正常。我已经多次检查文件确实是 utf-8。我不知道问题出在 open() 函数,还是显示字符时的 print() 函数。无论如何,这很奇怪。 "ansi" 版本是一个解决方案,但问题是它会导致 Lark 出现问题,它使用打开的文件的内容。

在我这里给出的截图中,代码是基本的:

with open(str(GRAMMAR), "r", encoding="utf-8-sig") as grammar:
    print(grammar.read())

可能这个问题是由什么引起的?

【问题讨论】:

  • 屏幕截图中的输出是否来自您的终端?这可能完全是打印问题,而不是实际字符串的问题,尤其是在 Windows 上。你有其他方法检查吗?
  • 您可以尝试将sys.stdout.reconfigure(encoding='utf-8') 放在脚本的前面,看看是否有帮助。
  • 您能否将文件缩减为失败的单行,用二进制读取文件,打印结果:print(open(file,'rb').read()),然后编辑您的问题以包含它?这将消除文件内容和编码的歧义。 ansiutf-8 是完全不同的编码,如果 utf-8 有效,则文件以 UTF-8 编码。如果读取为 UTF-8,带有这些字符的“ANSI”编码文件会引发异常。

标签: python utf-8 character-encoding lark-parser


【解决方案1】:

在 Windows 机器上,Python 将名称“ansi”识别为“mbcs”编解码器的alias,定义为

仅限 Windows:根据 ANSI 代码页 (CP_ACP) 对操作数进行编码。

所以 ansi 是一种有效的编码,但它与 ASCII 或 UTF-8 不同,因此存在明显的混淆。

【讨论】:

    【解决方案2】:

    我刚刚注意到:ansi 不是编码。编码的正确名称是ascii。这意味着当我输入encoding="ansi" 时,python 忽略了我要求它设置和读取文件的默认编码,通常是 utf-8。这并不能解释为什么它不适用于 utf-8-sig 或为什么 Lark 对我大喊大叫,但这是针对我的情况的。因此,对于这个问题的未来读者,请检查 2 件事:

    1. 如果您想使用 ascii,请输入 ascii,而不是 ansi
    2. 坚持默认设置。

    【讨论】:

      猜你喜欢
      • 2011-03-25
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-25
      • 2013-06-07
      • 1970-01-01
      相关资源
      最近更新 更多