ディレクトリに置かれているすべてのファイルのエンコーディングを見つける必要があります。使用されているエンコーディングを見つける方法はありますか?
file
コマンドはこれを行うことができません。
私にとって関心のあるエンコーディングは、ISO-8859-1です。エンコーディングがそれ以外の場合は、ファイルを別のディレクトリに移動したいです。
file -bi <file name>
たくさんのファイルに対してこれを行いたい場合
for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
uchardet - Mozillaから移植されたエンコーディング検出ライブラリ。
使用法:
~> uchardet file.Java
UTF-8
さまざまなLinuxディストリビューション(Debian/Ubuntu、OpenSuse-packmanなど)がバイナリを提供しています。
これはMacOsXで動作するファイル-Iとiconvを使ったスクリプト例です。あなたの質問ではiconvの代わりにmvを使う必要があります。
#!/bin/bash
# 2016-02-08
# check encoding and convert files
for f in *.Java
do
encoding=`file -I $f | cut -f 2 -d";" | cut -f 2 -d=`
case $encoding in
iso-8859-1)
iconv -f iso8859-1 -t utf-8 $f > $f.utf8
mv $f.utf8 $f
;;
esac
done
それがiso-8859-1であるかどうかを判断するのは本当に難しいです。 7ビット文字のみのテキストがあり、それがiso-8859-1でもある場合、それはわかりません。あなたが8ビット文字を持っているならば、上部領域文字も同様に順番エンコーディングで存在します。そのため、あなたはそれがどのWordであるかをよりよく推測し、そこからどの文字でなければならないかを判断するために辞書を使用しなければならないでしょう。最後に、あなたがそれがiso-8859-1ではないと確信しているよりそれがutf-8であるかもしれないことを検出した場合
エンコーディングは、あなたに何も伝えていないかどうかわからないので、やるべき最も難しいことの1つです。
Pythonでは、chardetモジュールを使うことができます。 https://github.com/chardet/chardet
Debianでは、encguess
:を使うこともできます。
$ encguess test.txt
test.txt US-ASCII
XMLファイル(ISO-8859-1)について話しているのであれば、その中のXML宣言はエンコーディングを指定しています:<?xml version="1.0" encoding="ISO-8859-1" ?>
したがって、そのような指定についてすべてのファイルをチェックするために(例えばPerl
と共に)正規表現を使用することができます。
より詳しい情報はここにあります: テキストファイルのエンコーディングを決定する方法 。
これはあなたが絶対確実な方法でできることではありません。ファイル内のすべての文字を調べて0x00 - 0x1f
または0x7f -0x9f
の範囲の文字が含まれていないことを確認することも考えられますが、前述のとおり、これは少なくとも1つの他の亜種を含むファイルに当てはまります。 ISO8859.
サポートされているすべての言語でファイル内の特定の単語を探して、それらが見つかるかどうかを確認することもできます。
したがって、たとえば、サポートされている8859-1のすべての言語で、英語の「and」、「but」、「to」、「of」などに相当するものを見つけて、それらが言語内で多数出現するかどうかを確認します。ファイル。
私は以下のような文字通りの翻訳については話していません。
English French
------- ------
of de, du
and et
the le, la, les
それは可能ですが。私はターゲット言語での一般的な単語について話しています(私が知っている限りでは、Icelandicには "and"の単語はありません - あなたはおそらく彼らのWordを "魚"のために使わなければなりません。ただのポイントを説明するだけで、あらゆる違法行為を意味します。
エンコードを8859からASCIIに変換するには、以下のようにします。
iconv -f ISO_8859-1 -t ASCII filename.txt
私はあなたがより一般的な答えに興味を持っていることを知っていますが、ASCIIの良いところは他のエンコーディングのところでよくあります。標準入力がASCIIかどうかを判断するためのPythonのワンライナーです。 (私はこれがPython 2でうまくいくと確信しています、しかし私はPython 3でそれをテストしただけです)
python -c 'from sys import exit,stdin;exit()if 128>max(c for l in open(stdin.fileno(),"b") for c in l) else exit("Not ASCII")' < myfile.txt
Fileコマンドを使用して単一ファイルのエンコーディングを抽出できます。 sample.htmlファイルがあります。
$ file sample.html
sample.html:HTMLドキュメント、UTF-8 Unicodeテキスト、非常に長い行
$ file -b sample.html
HTML文書、非常に長い行を含むUTF-8 Unicodeテキスト
$ file -bi sample.html
text/html; charset = utf-8
$ file -bi sample.html | awk -F'=' '{print $2 }'
uTF-8
私は次のスクリプトを使っています
。
#!/bin/bash -xe
SRC_ENCODING="iso-8859-1"
DST_ENCODING="utf-8"
FILTER="*.Java"
echo "Find all files that match the encoding $SRC_ENCODING and filter $FILTER"
FOUND_FILES=$(find . -iname "$FILTER" -exec file -i {} \; | grep "$SRC_ENCODING" | grep -Eo '^.*\.Java')
for FILE in $FOUND_FILES ; do
ORIGINAL_FILE="$FILE.$SRC_ENCODING.bkp"
echo "Backup original file to $ORIGINAL_FILE"
mv "$FILE" "$ORIGINAL_FILE"
echo "converting $FILE from $SRC_ENCODING to $DST_ENCODING"
iconv -f "$SRC_ENCODING" -t "$DST_ENCODING" "$ORIGINAL_FILE" -o "$FILE"
done
echo "Deleting backups"
find . -iname "*.$SRC_ENCODING.bkp" -exec rm {} \;
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
Cygwinでは、これは私にとってうまくいくように見えます。
find -type f -name "<FILENAME_GLOB>" | while read <VAR>; do (file -i "$<VAR>"); done
例:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done
Iconvでサポートされている任意のソースエンコーディングからそれをawkにパイプして、すべてをutf8に変換するiconvコマンドを作成できます。
例:
find -type f -name "*.txt" | while read file; do (file -i "$file"); done | awk -F[:=] '{print "iconv -f "$3" -t utf8 \""$1"\" > \""$1"_utf8\""}' | bash
このコマンドで:
for f in `find .`; do echo `file -i "$f"`; done
ディレクトリおよびサブディレクトリ内のすべてのファイルと対応するエンコーディングをリストできます。