歡迎您光臨本站 註冊首頁

其實說到編碼轉換,那就不得不說到iconv這個庫了,如果已經安裝了這個工具,那在命令行下直接打這個命令就行了。下面就用這個工具來實現中文系統下的常用編碼轉換。

首先,來了解一下iconv這個命令的使用方法。命令格式如下

iconv -f 編碼 -t 編碼 文件名

-f 參數指所要轉換文件的文件編碼,當然必須事先知道文件的編碼,不然不能正確轉換。

-t 參數指希望轉換成的文件編碼,當然應該知道所指定文件的編碼能不能轉換成該編碼,不然轉換后的結果可能一無所用。比如你將中文編碼轉換成西歐的某種編碼的話,是沒有什麼意義的。

文件名 就是你希望轉換的文件的名稱的,當然也可以包含路徑了。

比如將a.txt文件用GB2312(簡體)轉換成BIG5(繁體),命令如下:

$iconv -f GB2312 -t BIG5 a.txt

當然也可以使用iconv -l來查看都有哪些編碼可用,命令如下:

$iconv -l

那麼,如果不知道文件的編碼怎麼辦?比如我的系統中有繁體字編碼的文件,也有UTF-8編碼的文件,又有簡體字編碼的文件,但是系統說使用的編碼是簡體的。怎樣把所有文件的編碼都轉換成簡體字,或者怎樣將所有文件的編碼變成繁體字編碼,或者怎樣將所有的文件都轉換成UTF-8編碼呢?下面的這段程序將告訴你去怎樣實現這個功能。

#!/bin/bash

#文件名
fname=$1
#臨時文件,用來保存轉換的結果
tmpfile="cc`date +%0H%0M%0S`.liu"
#沒有輸入文件名
if [ -z ${fname} ] ; then
echo "Bad file name. ";
exit;
fi
#輸入的文件不存在
if [ ! -f ${fname} ] ; then
echo "File is not existed.FILE="${fname};
exit;
fi
################################################
# f_code:現有文件的編碼,當不太清楚現有文件的編碼的時候,
# 可以同時指定的幾種可能的編碼
# t_code:希望轉換成的目標編碼
################################################
#比如要將GB2312或者UTF-8的文件轉換成BIG5(繁體)文件
t_code="BIG5" #目標編碼
f_code="GB2312 UTF-8" #可以轉換的文字編碼

#判斷系統文字編碼是否為GB2312,是的話則將BIG5或者UTF-8編碼的文件轉換成系統一樣
#的GB2312
echo $LANG | grep -i GB2312> /dev/null
if [ $? -eq 0 ] ; then
t_code="GB2312" #目標編碼
f_code="BIG5 UTF-8" #可以轉換的文字編碼
fi

#判斷系統文字編碼是否為BIG5, 是的話則將GB2312或者UTF-8編碼的文件轉換成系統一樣
#的GB2312
echo $LANG | grep -i BIG5 > /dev/null
if [ $? -eq 0 ] ; then
t_code="BIG5" #目標編碼
f_code="GB2312 UTF-8" #可以轉換的文字編碼
fi
#如果要把GB2312,BIG5文字編碼的文件統一轉換成UTF-8,則應該這樣
t_code="UTF-8" #目標編碼
f_code="GB2312 BIG5" #可以轉換的文字編碼

#當然你也可以任意設置你需要互相轉換的編碼,但主意要保證編碼之間可以自由轉換。比如
#你要將GB2312轉換成某種西歐編碼,則沒有什麼意義了。
normal_msg=""
error_msg=""
#依次嘗試從可以轉換的文字編碼開始對文件進行編碼轉換
for code in ${f_code} ; do
#文字編碼轉換
iconv -f $code -t $t_code ${fname} > ${tmpfile}
#轉換成功,一旦轉換成功則不用再嘗試用其他編碼來讀取文件
if [ $? -eq 0 ] ; then
normal_msg="ICONV SUCCESSED! FILENAME=${fname} F_CODE=$code,T_CODE=$t_code"
break
else #轉換失敗
if [ ! -z "${error_msg}" ] ; then
error_msg="${error_msg} "
fi
error_msg="${error_msg}ICONV FAILED! FILENAME=${fname} F_CODE=$code,T_CODE=$t_code"
fi
done
#輸出轉換結果消息
#轉換成功,則輸出轉換成功消息;所有嘗試轉換都失敗的時候,則輸出所有轉換失敗消息
if [ -z "${normal_msg}" ] ; then
echo -e ${error_msg}
else
cp -f ${tmpfile} $fname
echo ${normal_msg}
fi

#刪除臨時文件
if [ -f ${tmpfile} ] ; then
rm -f ${tmpfile};
fi


在上面的程序中,實際上只是實現了一個文件的轉換,如果要實現多個文件的轉換的話,該怎麼辦了,其實很簡單了,只需要遍歷一下文件就行了。遍歷文件的方法很多,也就不詳細解說了,下面僅舉一個用find命令來查找文件並對找到的文件進行編碼轉換。命令很簡單,如下:

$find . -type f -name 『*.txt』 | xargs -l sh cc.sh

其中cc.sh是上面的程序文件。該命令查找當前目錄下所有的後綴為txt的文件比對其進行編碼轉換。

在上面的程序中,為了說明方便,文件編碼和轉換的目標編碼都是在程序里設定的,如果需要更加實用一點的話,可以把原文件的編碼和轉換的目標編碼都作為參數來輸入,這樣的話,這個程序就不光是中文系統下的文件編碼轉換了,日文,韓文等等編碼的轉換也能很輕鬆實現了。

[火星人 ] Linux下對文件進行編碼轉換(簡體→繁體,繁體→簡體,簡體繁體→UTF-8)已經有853次圍觀

http://coctec.com/docs/linux/show-post-123068.html