web-dev-qa-db-ja.com

スクリプトでUnixのファイルのエンコーディングを見つける方法

ディレクトリに置かれているすべてのファイルのエンコーディングを見つける必要があります。使用されているエンコーディングを見つける方法はありますか?

fileコマンドはこれを行うことができません。

私にとって関心のあるエンコーディングは、ISO-8859-1です。エンコーディングがそれ以外の場合は、ファイルを別のディレクトリに移動したいです。

248
Manglu

encaを探しているようですね。それは、エンコーディングを推測して変換することさえできます。 のmanページ を見てください。

あるいは失敗した場合は、file -i(linux)またはfile -I(osx)を使用してください。ファイルのMIMEタイプ情報が出力されます。これには文字セットエンコーディングも含まれます。私はそれのために manページ も見つけました:)

352
Shalom Craimer
file -bi <file name>

たくさんのファイルに対してこれを行いたい場合

for f in `find | egrep -v Eliminate`; do echo "$f" ' -- ' `file -bi "$f"` ; done
68
madu

uchardet - Mozillaから移植されたエンコーディング検出ライブラリ。

使用法:

~> uchardet file.Java 
UTF-8

さまざまなLinuxディストリビューション(Debian/Ubuntu、OpenSuse-packmanなど)がバイナリを提供しています。

28
qwert2003

これは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
9
Wolfgang Fahl

それがiso-8859-1であるかどうかを判断するのは本当に難しいです。 7ビット文字のみのテキストがあり、それがiso-8859-1でもある場合、それはわかりません。あなたが8ビット文字を持っているならば、上部領域文字も同様に順番エンコーディングで存在します。そのため、あなたはそれがどのWordであるかをよりよく推測し、そこからどの文字でなければならないかを判断するために辞書を使用しなければならないでしょう。最後に、あなたがそれがiso-8859-1ではないと確信しているよりそれがutf-8であるかもしれないことを検出した場合

エンコーディングは、あなたに何も伝えていないかどうかわからないので、やるべき最も難しいことの1つです。

5
Norbert Hartl

Pythonでは、chardetモジュールを使うことができます。 https://github.com/chardet/chardet

3
fccoelho

Debianでは、encguess:を使うこともできます。

$ encguess test.txt
test.txt  US-ASCII
3
not2qubit

XMLファイル(ISO-8859-1)について話しているのであれば、その中のXML宣言はエンコーディングを指定しています:<?xml version="1.0" encoding="ISO-8859-1" ?>
したがって、そのような指定についてすべてのファイルをチェックするために(例えばPerlと共に)正規表現を使用することができます。
より詳しい情報はここにあります: テキストファイルのエンコーディングを決定する方法

2
evgeny9

これはあなたが絶対確実な方法でできることではありません。ファイル内のすべての文字を調べて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を "魚"のために使わなければなりません。ただのポイントを説明するだけで、あらゆる違法行為を意味します。

2
paxdiablo

エンコードを8859からASCIIに変換するには、以下のようにします。

iconv -f ISO_8859-1 -t ASCII filename.txt
2
fimbulwinter

私はあなたがより一般的な答えに興味を持っていることを知っていますが、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
1
wkschwartz

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

0
Daniel Faure

私は次のスクリプトを使っています

  1. FILTERとSRC_ENCODINGが一致するすべてのファイルを検索してください。
  2. それらのバックアップを作成します
  3. それらをDST_ENCODINGに変換する
  4. (オプション)バックアップを削除します

#!/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 {} \;
0
Matyas

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
0
Mohamed23gharbi

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
0
skeetastax

このコマンドで:

for f in `find .`; do echo `file -i "$f"`; done

ディレクトリおよびサブディレクトリ内のすべてのファイルと対応するエンコーディングをリストできます。

0
danilo