2012-04-14 11 views
5

テキストファイルがPythonでUTF-8であるかどうかを認識する方法はありますか?ファイルがUTF-8を使用してエンコードされているかどうかを検出するにはどうすればよいですか?

ファイルがUTF-8であるかどうかは本当に気に入っています。私は他のエンコーディングを検出する必要はありません。

+1

重複? http://stackoverflow.com/questions/436220/python-is-there-a-way-to-determine-the-encoding-of-text-fileおよびhttp://stackoverflow.com/questions/2144815/how-知っている - ファイル中のPythonのコード化 – CppLearner

+0

私はすべてのエンコーディングではなく、UTF-8(真偽)を検出するように求めていました。 – Riki137

+0

ファイルの内容が分からない限り、高い確信度で推測できます。たとえば、ファイルのタイプ(この場合はテキストファイルを要求しています)。ほとんどの場合、あなたは推測することができます。私はこれを数回去ってきました。その理由は次のとおりです。 – CppLearner

答えて

16

あなたはコメントで、UTF-8を検出する必要があることだけを述べました。代わりに1バイトのエンコーディングのみで構成されていることが分かっている場合は、しばしば機能するソリューションがあります。

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

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

が検出

chardet:

try: 
    # or codecs.open on Python 2 
    filedata = open(filename, encoding='UTF-8').read() 
except: 
    filedata = open(filename, encoding='other-single-byte-encoding').read() 

あなたの最善の策は、直接またはBeautifulSoupからUnicodeDamnitを通じて、chardet package from PyPIを使用することです

  • ASCII、UTF-8、UTF-16(2変種)、UTF-32(4変種)
  • ビッグ5、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、窓-1251(キリル文字)
  • ISO-8859-2、窓-1250(ハンガリー)
  • ISO-8859-5、窓-1251(ブルガリア)
  • の窓-1252(英語)
  • ISO-8859-7、窓-1253(ギリシャ)
  • ISO-8859-8、窓-1255(視覚と論理ヘブライ語)
  • TIS-620(タイ)

は、Python 2.1以降

が必要しかし、いくつかのファイルがそうchardetは万能薬ではない、複数のエンコーディングに有効となります。

+0

'chardet'はとても遅いです! – simon

+4

@simon:そのため、「cchardet」(https://github.com/PyYoshi/cChardet)(注:2つの「c」)があります – jfs

2

信頼できますか?一般的には第

あなたがそれを解釈する方法を知っている限り、バイト列は意味がありません - これは等のテキストファイルだけでなく、整数、浮動小数点数、のために行く

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

関連する問題