1

我想知道 python 库是否具有通过查找 BOM 的存在来返回文件字符编码的函数。

我已经实现了一些东西,但我只是担心我可能会重新发明轮子

更新:(基于 John Machin 的更正):

import codecs

def _get_encoding_from_bom(fd):
    first_bytes = fd.read(4)
    fd.seek(0)
    bom_to_encoding = (
        (codecs.BOM_UTF32_LE, 'utf-32'),
        (codecs.BOM_UTF32_BE, 'utf-32'),
        (codecs.BOM_UTF8, 'utf-8-sig'),
        (codecs.BOM_UTF16_LE, 'utf-16'),
        (codecs.BOM_UTF16_BE, 'utf-16'),
        )
    for bom, encoding in bom_to_encoding:
        if first_bytes.startswith(bom):
             return encoding
    return None
4

1 回答 1

2

你的代码有一个你可能永远不会被咬的微妙错误,但最好避免它。

您正在遍历字典的键。Python 不保证迭代的顺序。在这种情况下,顺序确实很重要。

codecs.BOM_UTF32_LE is '\xff\xfe\x00\x00'
codecs.BOM_UTF16_LE is '\xff\xfe'

如果您的文件是用 UTF-32LE 编码的,但恰好首先测试了 UTF-16LE,那么您会错误地指出文件是用 UTF-16LE 编码的。

为避免这种情况,您可以遍历按 BOM 长度降序排序的元组。请参阅我对此问题的回答中的示例代码。

于 2013-02-20T20:22:59.503 回答