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