意圖:

經常遇到檔案編碼轉換的問題, 特別是檔案目錄批量轉換, 不想一個一個的轉, 所以寫了個shell指令碼, 一勞永逸

指令碼適用環境:

linux環境, 並且可以使用iconv命令, 如果沒有iconv命令, 可以通過編譯iconv原始碼來安裝

附shell指令碼:

if [ $# != 4 ]
then
    echo -e  "\n指令碼需要四個引數"
    echo -e  "  引數1: 原始編碼格式\n  引數2:目標編碼格式\n  引數3: 待轉碼的檔案目錄\n  引數4: 轉碼後的檔案目錄\n"
    echo -e  "示例: icon.sh  from_encoding  to_encoding  in_dir  out_dir\n"
    exit
else
    FROM_ENCODING=$1
    TO_ENCODING=$2
    IN_DIR=$3
    OUT_DIR=$4
fi


#引數:兩個引數, 輸入目錄和輸出目錄
#功能:使輸出目錄中目錄樹與輸入目錄相同
function create_outDirTree()
{
    in_dir=$1
    out_dir=$2

    for dir in `find $in_dir -type d`
    do
        sub_dir=`echo $dir|awk -F "$in_dir" '{print $2}'`
        new_dir=${out_dir}/$sub_dir
        mkdir -p $new_dir    
    done
}


#引數: 四個引數, 原始編碼、目標編碼、原始檔案、目標檔案
#功能: 實現檔案的編碼轉換
function iconv_file()
{
   iconv -f $1  -t $2 $3 -o $4 1>iconvLog 2>&1

   errString=`cat iconvLog|grep "illegal input sequence"`
   
   if [ -z "$errString" ]
   then
        :
   else
        echo -e "$3\n   $errString"
   fi

   rm -rf iconvLog
}


#功能: 將源目錄中的所有檔案進行編碼轉換, 輸出到另一目錄, 源目錄檔案保持不變
function main()
{
    create_outDirTree $IN_DIR $OUT_DIR
    
    for f in `find $IN_DIR -type f`
    do
        fname=`echo $f|awk -F "$IN_DIR" '{print $2}'`
        out_fname=$OUT_DIR/$fname
        iconv_file $FROM_ENCODING $TO_ENCODING $f $out_fname
    done

}



#主程式
main