バリアント文字セットでエンコードされた多くのプレーンテキストファイルがあります。
それらすべてをUTF-8に変換したいのですが、iconvを実行する前に、その元のエンコーディングを知る必要があります。ほとんどのブラウザはエンコーディングにAuto Detect
オプションを持っています、しかし、あまりにも多くあるので私はそれらのテキストファイルを一つずつチェックすることができません。
元のエンコーディングを知っているだけで、テキストをiconv -f DETECTED_CHARSET -t utf-8
で変換できます。
プレーンテキストファイルのエンコーディングを検出するためのユーティリティはありますか? 100%完璧である必要はありません、100万のファイルが100万のファイルの中に間違って変換されていても構いません。
PyPiで利用可能な chardet Pythonモジュールを試してください。
pip install chardet
それからchardetect myfile.txt
を実行してください。
Chardetは、Mozillaで使用されている 検出コード に基づいているため、入力テキストが統計分析に十分な長さであれば、妥当な結果が得られます。 プロジェクトのドキュメント を読んでください。
コメントで述べたように、それは非常に遅いです、しかし@Xavierが https://superuser.com/a/609056 で見つけたのでいくつかのディストリビューションはまたオリジナルのC++バージョンを出荷します。どこかにJavaバージョンもあります。
私はこの簡単なコマンドを使います。
encoding=$(file -bi myfile.txt)
または実際の文字セットだけが必要な場合(utf-8
など):
encoding=$(file -b --mime-encoding myfile.txt)
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
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'}
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」オプションを参照)仕事ができます。
UTFCastは試してみる価値があります。私のためには動作しませんでした(おそらく私のファイルがひどいので)。それはよさそうです。
http://www.addictivetips.com/windows-tips/how-to-batch-convert-text-files-to-utf-8-encoding/
Mozillaには、Webページの自動検出用のNiceコードベースがあります。
http://lxr.mozilla.org/seamonkey/source/extensions/universalchardet/src/
アルゴリズムの詳細な説明
http://www-archive.mozilla.org/projects/intl/UniversalCharsetDetection.html
isutf8
(moreutils
パッケージから)
また、ファイル-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