在 Linux 中,命令列工具 iconv 用來將使用一種編碼的文字轉化為另一種編碼。
你可以使用 file 命令,並新增 -i 或 –mime 引數來檢視一個檔案的字元編碼,這個引數可以讓程式像下面的例子一樣輸出字串的 mime (Multipurpose Internet Mail Extensions) 資料:
$ file -i Car.java
$ file -i CarDriver.java
在 Linux 中檢視檔案的編碼
iconv 工具的使用方法如下:
$ iconv option
$ iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile
在這裡,-f 或 –from-code 表明了輸入編碼,而 -t 或 –to-encoding 指定了輸出編碼。
為了列出所有已有編碼的字符集,你可以使用以下命令:
$ iconv -l
列出所有已有編碼字符集
將檔案從 ISO-8859-1 編碼轉換為 UTF-8 編碼
下面,我們將學習如何將一種編碼方案轉換為另一種編碼方案。下面的命令將會將 ISO-8859-1 編碼轉換為 UTF-8 編碼。
考慮如下檔案 input.file,其中包含這幾個字元:
� � � �
我們從檢視這個檔案的編碼開始,然後來檢視檔案內容。最後,我們可以把所有字元轉換為 UTF-8 編碼。
在執行 iconv 命令之後,我們可以像下面這樣檢查輸出檔案的內容,和它使用的字元編碼。
$ file -i input.file
$ cat input.file
$ iconv -f ISO-8859-1 -t UTF-8//TRANSLIT input.file -o out.file
$ cat out.file
$ file -i out.file
在 Linux 中將 ISO-8859-1 轉化為 UTF-8
注意:如果輸出編碼後面新增了 //IGNORE 字串,那些不能被轉換的字元將不會被轉換,並且在轉換後,程式會顯示一條錯誤資訊。
好,如果字串 //TRANSLIT 被新增到了上面例子中的輸出編碼之後 (UTF-8//TRANSLIT),待轉換的字元會盡量採用形譯原則。也就是說,如果某個字元在輸出編碼方案中不能被表示的話,它將會被替換為一個形狀比較相似的字元。
而且,如果一個字元不在輸出編碼中,而且不能被形譯,它將會在輸出檔案中被一個問號標記 ? 代替。
將多個檔案轉換為 UTF-8 編碼
回到我們的主題。如果你想將多個檔案甚至某目錄下所有檔案轉化為 UTF-8 編碼,你可以像下面一樣,編寫一個簡單的 shell 指令碼,並將其命名為 encoding.sh:
#!/bin/bash
### 將 values_here 替換為輸入編碼
FROM_ENCODING=”value_here”
### 輸出編碼 (UTF-8)
TO_ENCODING=”UTF-8″
### 轉換命令
CONVERT=” iconv -f $FROM_ENCODING -t $TO_ENCODING”
### 使用迴圈轉換多個檔案
for file in *.txt; do
$CONVERT “$file” -o “${file%.txt}.utf8.converted”
done
exit 0
儲存檔案,然後為它新增可執行許可權。在待轉換檔案 (*.txt) 所在的目錄中執行這個指令碼。
$ chmod +x encoding.sh
$ ./encoding.sh
重要事項:你也可以使這個指令碼變得更通用,比如轉換任意特定的字元編碼到另一種編碼。為了達到這個目的,你只需要改變 FROM_ENCODING 及 TO_ENCODING 變數的值。別忘了改一下輸出檔案的檔名”${file%.txt}.utf8.converted”.
若要了解更多資訊,可以檢視 iconv 的手冊頁 man page 。
$ man iconv