我想知道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

最佳答案

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

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

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


如果您的文件是使用UTF-32LE编码的,而UTF-16LE恰好首先被测试,则您会错误地指出该文件是使用UTF-16LE编码的。

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

关于python - 从BOM表发现编码的功能,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13584348/

10-12 18:44