2012-01-06 3 views
1

私は英語の.txtがLatin-1であると信じていますが、別のエンコーディングの断片を含んでいる可能性があります。これらの断片を見つけるためのライブラリやツールはありますか?ほとんどLatin-1ファイル内のLatin-1以外のテキストの断片を見つけるには?

私はPython chardatライブラリのようなことを知っていますが、私は特にLatin-1ファイルをテストし、異常を検出するツールを探しています。たとえそれが非ラテン1パターンを検出して私に索引を与えるポイントを教えてもらえれば、定期的な検出ライブラリでさえも問題ありません。

コマンドラインツールとPythonライブラリは特に大歓迎です。

+0

私はあなたの痛みを感じるが、あなたは[enca](http://linux.die.net/man/1/enca)のようなものを試してみましたか? – Gleno

+0

Encaは完璧に見えますが、奇妙なことに、英語をサポートしていないようです。東ヨーロッパ言語のほんの一束。英語で広範囲な文書があるので、本当に奇妙です。 – Alex

+0

異常の例を教えてください。 UTF8などの8ビット文字セットをお探しですか?コードポイント0x80-0x9Fはラテン語では定義されていませんが、それ以外の場合はすべてのシーケンスが有効です。あなたがKOI-8rのようなものを探しているのであれば、ラテン文字、レター周波数、およびnグラムの文字シーケンスは良いヒューリスティックですが、個々のキャラクターごとに確実に知る方法はありません。 – tripleee

答えて

0

Latin-1(またはラテン15のユーロ記号付きの意味ですか?)を検出するのは簡単ではありません。

未使用の文字が実際に使用されているかどうかは、 で確認できます(表here参照)。しかし、より微妙な違反を検出するには、言語がlatin-1が使用されている言語かどうかを実際に確認する必要があります。それ以外の場合は、8ビットのエンコーディングを区別する方法がありません。最初の場所で8ビットエンコーディングを混在させない方が良いでしょう。何らかの方法でエンコーディングの変更をマークする必要はありません。

0

file(1)がLatin-1(2 )は、別のエンコーディングでフラグメントを含むかもしれませんか?ファイルのサイズはどれくらいですか? 「定期的な検出ライブラリ」とは何ですか?たとえばWindowsのエンコードなどの可能性を考えましたか? cp1252?

いくつかの広いブラシ診断:

# preliminaries 
text = open('the_file.txt', 'rb').read() 
print len(text), "bytes in file" 

# How many non-ASCII bytes? 
print sum(1 for c in text if c > '\x7f'), "non-ASCII bytes" 

# Will it decode as UTF-8 OK? 
try: 
    junk = text.decode('utf8') 
    print "utf8 decode OK" 
except UnicodeDecodeError, e: 
    print e 

# Runs of more than one non-ASCII byte are somewhat rare in single-byte encodings 
# of languages written in a Latin script ... 
import re 
runs = re.findall(r'[\x80-\xff]+', text) 
nruns = len(runs) 
print nruns, "runs of non-ASCII bytes" 
if nruns: 
    avg_rlen = sum(len(run) for run in runs)/float(nruns) 
    print "average run length: %.2f bytes" % avg_rlen 
# then if indicated you could write some code to display runs in context ... 
関連する問題