繁体   English   中英

为什么 python 的 open() 函数会破坏我的 utf-8 文件?

[英]Why does python's open() function mangle my utf-8 files?

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

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

open()编码设置为"utf-8-sig"时损坏的字符

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

encoding="ansi"普通字符

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

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

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

什么可能这个问题所致?

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

  1. 如果要使用 ascii,请键入ascii ,而不是ansi
  2. 坚持使用默认值。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM