このメッセージはかなり古いですが、私はこの問題に貢献できると思います:
最初に recodeifneeded という名前のスクリプトを作成します :
#!/bin/bash
# Find the current encoding of the file
encoding=$(file -i "$2" | sed "s/.*charset=\(.*\)$/\1/")
if [ ! "$1" == "${encoding}" ]
then
# Encodings differ, we have to encode
echo "recoding from ${encoding} to $1 file : $2"
recode ${encoding}..$1 $2
fi
このように使用できます:
recodeifneeded utf-8 file.txt
したがって、再帰的に実行し、すべての *.txt ファイルのエンコーディングを (たとえば) utf-8 に変更したい場合:
find . -name "*.txt" -exec recodeifneeded utf-8 {} \;
これがお役に立てば幸いです。
このスクリプトは、(特定の UTF-8 でエンコードされたスカンジナビア文字の存在に基づいて) 1 つのファイルを条件付きで再コード化する harrymc のアイデアから採用されており、私にとってはかなりうまく機能しているようです。
$ cat recode-to-utf8.sh
#!/bin/sh
# Recodes specified file to UTF-8, except if it seems to be UTF-8 already
result=`grep -c [åäöÅÄÖ] $1`
if [ "$result" -eq "0" ]
then
echo "Recoding $1 from ISO-8859-1 to UTF-8"
recode ISO-8859-1..UTF-8 $1 # overwrites file
else
echo "$1 was already UTF-8 (probably); skipping it"
fi
(ファイルのバッチ処理は、もちろん for f in *txt; do recode-to-utf8.sh $f; done
などの単純な問題です .)
注意 :これは、スクリプト ファイル自体が UTF-8 であることに完全に依存します。これは明らかに、私がたまたま持っているファイルの種類に適した非常に限定的なソリューションであるため、より良い回答を自由に追加してください より一般的な方法で問題を解決します。
UTF-8 には、有効なバイト シーケンスに関する厳密な規則があります。これは、データが できた UTF-8 であるため、 であると仮定すると、誤検知が発生することはほとんどありません。 .
したがって、次のようなことができます (Python で):
def convert_to_utf8(data):
try:
data.decode('UTF-8')
return data # was already UTF-8
except UnicodeError:
return data.decode('ISO-8859-1').encode('UTF-8')
シェルスクリプトでは、 iconv
を使用できます 変換を実行するには、UTF-8 を検出する手段が必要です。 1 つの方法は iconv
を使用することです ソースと宛先の両方のエンコーディングとして UTF-8 を使用します。ファイルが有効な UTF-8 であった場合、出力は入力と同じになります。