1

Pythonライブラリに、BOMの存在を探すことでファイルの文字エンコードを返す関数があるかどうか疑問に思いました。

私はすでに何かを実装しましたが、私は車輪の再発明をしているのではないかと心配しています

更新:(ジョン・マチンの修正に基づく):

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 に答える