utf8編碼轉換腳本


  差不多去年的這個時候吧,由於項目組的編碼從GBK轉向UTF-8,讓我來負責轉換所有的源文件,當時frank給了我一個轉換的腳本,可以過濾文件類型來轉換,由於是frank自己使用的工具,所以也沒怎么注意容錯,基本上可以理解成是對某些類型的文件使用iconv -f gbk -t utf-8 這樣的命令來轉換。后來發現悲劇了,原因是有一些文件已經是utf-8編碼了,結果在強轉了一次,就亂碼了,因為只有幾個文件亂碼,所以一開始還沒注意到,直到后來發現的時候,又得一個一個重新轉回去,所以還是挺麻煩的。

  最近在用一個公共組件的時候,發現其提供的都是gbk編碼的,所以想着干脆還是寫一個腳本來完成這件事情吧,這次吸取了上次的教訓,首先會用file來判斷下文件的編碼是什么編碼的(當前只判斷gbk和utf-8),然后根據不同的類型,來設置不同的轉換選項。默認只轉換當前文件夾下的所有.cpp和.h文件,當然,路徑和文件類型,可以分別用-f和-t的參數傳進去。當然,如果你發現有什么沒有考慮到的地方,還請斧正,謝謝啦。

 

#!/bin/bash


file_type_list="cpp h"
file_path="."

#-f:文件名或者目錄名  -t: 文件類型
#如果不傳入參數,默認目錄為當前目錄,默認轉換文件類型為.h .cpp
#example:covert_to_utf8 -f . -t "cpp h"
while getopts "t:f:" arg #選項后面的冒號表示該選項需要參數
do
    case $arg in
        f)
            echo "f's arg:$OPTARG"
            file_path=$OPTARG
            ;;
        t)
            echo "t's arg:$OPTARG" 
            file_type_list=$OPTARG
            ;;
        ?)
            echo "unkonw argument"
            exit 1
            ;;
    esac
done

echo "file_type=" $file_type_list "file_path=" $file_path 


#如果是普通文件或者目錄才進行查找、轉換,其他情況,不轉換
if [  -f $file_path  -o  -d $file_path  ];
then
    echo "Begin to Convert $file_path from GBK to UTF-8...."
else
    echo " $file isn't a file or directory,can't convert! "
    exit;
fi


#找到普通文件,然后轉換這些文件
all_file=`find $file_path -type f`;

for file in $all_file;
do
    file_type=${file##*.} 
    #echo $file $file_type;
    if [[ "$file_type_list" != *"$file_type"* ]];
    then
        echo "$file_type not in $file_type_list"
        continue;
    fi
    
    file_encoding=`file $file | awk -F : '{print $2}' | awk '{print $1}'`
    #GBK
    if [ $file_encoding == "ISO-8859" ];
    then
        original_encoding="gbk"
    #ASCII or UTF-8
    elif [ $file_encoding == "ASCII" -o $file_encoding == "UTF-8" ];
    then
        echo "$file encoding $file_encoding is ok, not need convert"
        continue;
    #未定義的編碼
    else
        echo "$file error encoding $file_encoding, can't convert"
        continue;
    fi
    iconv -f $original_encoding -t utf-8 $file > $file"_tmp"
    #判斷是否轉換成功
    if [ $? != 0 ];
    then
        echo "covert $file failed!"
        continue;
    fi
    mv $file"_tmp" $file
    echo "convrt $file success!"
done

echo "All file convert done!"


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM