在這篇教程中,我們將解釋字元編碼的含義,然後給出一些使用命令列工具將使用某種字元編碼的檔案轉換為另一種編碼的範例。最後,我們將一起看看如何在 Linux 下將使用各種字元編碼的檔案轉換為 UTF-8 編碼。
你可能已經知道,電腦除了二進位數據,是不會理解和儲存字元、數字或任何人類能夠理解的東西的。一個二進位位只有兩種可能的值,也就是 0 或 1,真或假,是或否。其它的任何事物,如字元、資料和圖片,必須以二進位的形式來表現,以供電腦處理。
簡單來說,字元編碼是一種可以指示電腦來將原始的 0 和 1 解釋成實際字元的方式,在這些字元編碼中,字元都以一串數字來表示。
字元編碼方案有很多種,例如 ASCII、ANCI、Unicode 等等。下面是 ASCII 編碼的一個例子。
字符 二进制 A 01000001 B 01000010
在 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
將這篇指南總結一下,理解字元編碼的概念、了解如何將一種編碼方案轉換為另一種,是一個電腦使用者處理文字時必須要掌握的知識,程式設計師更甚。