用Python 2/3解析ANSI和UTF-16LE文件的最佳方法?
我有一堆文件,它们的编码格式是ANSI或者UTF-16LE。我想用Python打开这些文件,并且希望能够用正确的编码方式来打开。问题是,如果我用UTF-16LE来打开ANSI文件,或者用ANSI来打开UTF-16LE文件,Python并不会报错,这让我很困惑。
有没有简单的方法可以确保我用正确的编码来打开这些文件呢?
3 个回答
0
文件里有什么内容呢?如果是用拉丁字母写的纯文本,UTF-16LE格式的文件几乎每两个字节中就会有一个是零。而在windows-1252格式的文件中,我不太会看到零的存在。比如,这里是“Hello”
在windows-1252格式下的样子:
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的基础上扩展,添加了一些打印字符的映射,比如弯引号,以替代范围内的控制字符0x80..0x9F
)。
如果你知道所有的文件要么是windows-1252格式,要么是UTF-16LE格式,快速扫描一下零字节就能帮助你判断出是哪种格式。虽然chardet工具比较慢且复杂,但在这种情况下,我觉得你可以用简单粗暴的方法来解决。
0
你可以查看文件开头的字节顺序标记(BOM),来判断这个文件是否是UTF编码的。
然后根据需要使用unicode.decode来解码(可以用一些标准编码)。
编辑
或者,你可以试试用s.decode('ascii')来解码你的字符串(假设s是变量名)。如果出现UnicodeDecodeError错误,那就用'utf_16_le'来解码。
4
使用 chardet 这个库来检测文件的编码方式。