我有一组用ANSI或UTF-16LE编码的文件。我希望python使用正确的编码打开文件。问题是ANSI文件在使用UTF-16le编码时不会引发任何异常,反之亦然。

是否有使用正确文件编码打开文件的简单方法?

有帮助吗?

解决方案

使用 chardet 库检测编码。

其他提示

您可以在开头检查 BOM 该文件检查它是否为UTF。

然后相应地 unicode.decode (使用其中一个< a href =“http://docs.python.org/library/codecs.html#standard-encodings”rel =“nofollow noreferrer”>标准编码)。

修改 或者,也许,尝试s.decode('ascii')你的字符串(给定s是变量名)。如果它抛出UnicodeDecodeError,则将其解码为'utf_16_le'。

文件中有什么?如果它是基于拉丁语的字母表中的纯文本,那么几乎所有其他字节的UTF-16LE文件都将为零。另一方面,在windows-1252文件中,我不希望看到任何零。例如,这是Windows-1252中的&#8220; Hello&#8221;

93 48 65 6C 6C 6F 94

......以及UTF-16LE:

1C 20 48 00 65 00 6C 00 6C 00 6F 00 1D 20

除了卷曲引号外,每个字符都映射到相同的值,并添加了一个尾随的零字节。实际上,对于ISO-8859-1字符集中的每个字符都是如此(windows-1252扩展了ISO-8859-1以添加多个打印字符的映射&#8212;如同引号和#8212;以替换控件中的控制字符范围 0x80..0x9F )。

如果您知道所有文件都是windows-1252或UTF-16LE,那么您需要快速扫描零,以确定哪个是哪个。有一个很好的理由可以解释为什么chardet如此缓慢和复杂,但在这种情况下,我认为你可以快速而肮脏地逃脱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top