web-dev-qa-db-ja.com

テキストファイルのエンコーディングを自動検出する方法

バリアント文字セットでエンコードされた多くのプレーンテキストファイルがあります。

それらすべてをUTF-8に変換したいのですが、iconvを実行する前に、その元のエンコーディングを知る必要があります。ほとんどのブラウザはエンコーディングにAuto Detectオプションを持っています、しかし、あまりにも多くあるので私はそれらのテキストファイルを一つずつチェックすることができません。

元のエンコーディングを知っているだけで、テキストをiconv -f DETECTED_CHARSET -t utf-8で変換できます。

プレーンテキストファイルのエンコーディングを検出するためのユーティリティはありますか? 100%完璧である必要はありません、100万のファイルが100万のファイルの中に間違って変換されていても構いません。

65
Xiè Jìléi

PyPiで利用可能な chardet Pythonモジュールを試してください。

pip install chardet

それからchardetect myfile.txtを実行してください。

Chardetは、Mozillaで使用されている 検出コード に基づいているため、入力テキストが統計分析に十分な長さであれば、妥当な結果が得られます。 プロジェクトのドキュメント を読んでください。

コメントで述べたように、それは非常に遅いです、しかし@Xavierが https://superuser.com/a/609056 で見つけたのでいくつかのディストリビューションはまたオリジナルのC++バージョンを出荷します。どこかにJavaバージョンもあります。

51
grawity

私はこの簡単なコマンドを使います。

encoding=$(file -bi myfile.txt)

または実際の文字セットだけが必要な場合(utf-8など):

encoding=$(file -b --mime-encoding myfile.txt)
31
user103313

DebianベースのLinuxでは、 uchardet パッケージ( Debian / Ubuntu )はコマンドラインツールを提供します。以下のパッケージの説明を参照してください。

 universal charset detection library - cli utility
 .
 uchardet is a C language binding of the original C++ implementation
 of the universal charset detection library by Mozilla.
 .
 uchardet is a encoding detector library, which takes a sequence of
 bytes in an unknown character encoding without any additional
 information, and attempts to determine the encoding of the text.
 .
 The original code of universalchardet is available at
 http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet
 .
 Techniques used by universalchardet are described at
 http://www.mozilla.org/projects/intl/UniversalCharsetDetection.html
28
Xavier

Linuxの場合は enca が、Solarisの場合は auto_ef を使用できます。

16
cularis

Chardet(python 2.?)に戻ると、この呼び出しで十分かもしれません:

python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())' < file
{'confidence': 0.98999999999999999, 'encoding': 'utf-8'}

それは完璧には程遠いですが....

echo "öasd" | iconv -t ISO-8859-1 | python -c 'import chardet,sys; print chardet.detect(sys.stdin.read())'
{'confidence': 0.5, 'encoding': 'windows-1252'}
2
estani

Emacsを定期的に使っている人には、次のようなものが便利かもしれません(トランスフォームを手動で調べて検証することができます)。

さらに、Emacsの文字セット自動検出は他の文字セット自動検出ツール(chardetなど)よりもはるかに効率的であることがよくあります。

(setq paths (mapcar 'file-truename '(
 "path/to/file1"
 "path/to/file2"
 "path/to/file3"
)))

(dolist (path paths)
  (find-file path)
  (set-buffer-file-coding-system 'utf-8-unix)
  )

それから、このスクリプトを引数にしてEmacsを呼び出すだけで(「-l」オプションを参照)仕事ができます。

2
Yves Lhuillier

UTFCastは試してみる価値があります。私のためには動作しませんでした(おそらく私のファイルがひどいので)。それはよさそうです。

http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/

1
Sameer

Mozillaには、Webページの自動検出用のNiceコードベースがあります。
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/

アルゴリズムの詳細な説明
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html

1
Martin Hennings

isutf8moreutilsパッケージから)

0
Ronan

また、ファイル-iが不明の場合

以下のような文字セットを推測できるこのphpコマンドを使用できます。

Phpでは、以下のように確認できます。

エンコードリストを明示的に指定する:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), 'UTF-8, ASCII, JIS, EUC-JP, SJIS, iso-8859-1') . PHP_EOL;"

より正確な「mb_list_encodings」:

php -r "echo 'probably : ' . mb_detect_encoding(file_get_contents('myfile.txt'), mb_list_encodings()) . PHP_EOL;"

ここで最初の例では、一致する可能性のあるエンコードのリスト(リストの順序を検出)を配置していることがわかります。より正確な結果を得るには、次の方法ですべての可能なエンコーディングを使用できます:mb_list_encodings()

注意mb_ *関数にはphp-mbstringが必要です

apt-get install php-mbstring 

回答を参照してください: https://stackoverflow.com/a/57010566/3382822

0
Mohamed23gharbi