使用Python 2/3解析ANSI和UTF-16LE文件的最佳方法?

时间:2009-05-04 09:12:42

标签: python encoding ansi utf-16

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

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

3 个答案:

答案 0 :(得分:4)

使用chardet库检测编码。

答案 1 :(得分:0)

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

然后unicode.decode相应地(使用standard encodings之一)。

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

答案 2 :(得分:0)

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

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以添加多个打印字符的映射 - 如卷曲引号 - 来替换范围{{1}中的控制字符}})。

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