エンコーディングエラーの問題
2160 ワード
#!/bin/sh
rm bbb
touch bbb
cat aaa | while read line
do
echo $line | iconv -f utf8 -t gb2312 >> bbb
done
linuxの下には、ファイルの符号化フォーマットを検出するためのfileという2つの関連コマンドがあります.1つはiconvコマンドで、ファイルを2つの符号化フォーマット間で変換します.しかし、どのように回転しても、時には変換の失敗を報告する問題がよく発生します.私はずっとこれがどういうことなのかと思っています.一つの解釈は、ファイルの一部が破損しているので、全体的な変換ができないということです.では、部分的に破損している以上、部分的に読み取ることができ、部分的に変換することができ、失敗した場所は失敗してしまったので、私は多くの完全な行を変換することができます.
その後、上のスクリプトのバグを発見しました.スクリプト変換符号化エラーの場合、エラーの1行はすべて破棄されることを期待していますが、スクリプトはエラーの1行が符号化できる文字列をファイルに書き込み、このようなデータはファイルを破壊します.
#!/bin/sh
rm bbb
touch bbb
cat aaa | while read line
do
aline=`echo $line | iconv -f utf8 -t gb2312 2>/dev/null`
echo $aline | awk '{if(substr($0,length($0),1)==";")print $0 >> "'bbb'"}'
done