11

PythonでテキストファイルがUTF-8かどうかを認識する方法はありますか?

ファイルがUTF-8かどうかを知りたいです。他のエンコーディングを検出する必要はありません。

4

2 に答える 2

22

コメントで、UTF-8 を検出するだけでよいと述べました。代替手段が 1 バイト エンコーディングのみで構成されていることがわかっている場合は、多くの場合に機能する解決策があります。

UTF-8 または のような 1 バイト エンコーディングであることがわかっている場合はlatin-1、最初に UTF-8 で開き、次に別のエンコーディングで開いてみてください。ファイルに ASCII 文字のみが含まれている場合、別のエンコーディングとして意図されていたとしても、UTF-8 で開かれてしまいます。ASCII 以外の文字が含まれている場合、ほとんどの場合、2 つの文字セットの間で正しい文字セットが正しく検出されます。

try:
    # or codecs.open on Python <= 2.5
    # or io.open on Python > 2.5 and <= 2.7
    filedata = open(filename, encoding='UTF-8').read() 
except:
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

あなたの最善の策は、直接またはBeautifulSoupchardetから PyPI のパッケージを使用することです。UnicodeDamnit

シャルデ 1.0.1

ユニバーサル エンコーディング検出器

検出:

  • ASCII、UTF-8、UTF-16 (2 種類)、UTF-32 (4 種類)
  • Big5、GB2312、EUC-TW、HZ-GB-2312、ISO-2022-CN (繁体字および簡体字中国語)
  • EUC-JP、SHIFT_JIS、ISO-2022-JP (日本語)
  • EUC-KR、ISO-2022-KR (韓国語)
  • KOI8-R、MacCyrillic、IBM855、IBM866、ISO-8859-5、windows-1251 (キリル文字)
  • ISO-8859-2、windows-1250 (ハンガリー語)
  • ISO-8859-5、windows-1251 (ブルガリア語)
  • windows-1252 (英語)
  • ISO-8859-7、windows-1253 (ギリシャ語)
  • ISO-8859-8、windows-1255 (視覚的および論理的ヘブライ語)
  • TIS-620(タイ語)

Python 2.1 以降が必要です

ただし、一部のファイルは複数のエンコーディングで有効であるためchardet、万能薬ではありません。

于 2012-04-14T18:19:47.543 に答える
3

確実に?いいえ。

一般に、バイト シーケンスは、それを解釈する方法を知らなければ意味がありません。これは、テキスト ファイルだけでなく、整数、浮動小数点数などにも当てはまります。

ただし、バイト オーダー マーク (存在する場合) とファイルの最初のチャンク (どのエンコーディングが最も適切な文字を生成するかを確認するため) を調べることで、ファイルのエンコーディングを推測する方法があります。ライブラリはこれchardetに非常に優れていますが、かなり強力ではありますが、ヒューリスティックにすぎないことに注意してください。

于 2012-04-14T18:20:38.120 に答える