如何在Linux中將文件編碼轉(zhuǎn)換為UTF-8
在這篇教程中,我們將解釋字符編碼的含義,然后給出一些使用命令行工具將使用某種字符編碼的文件轉(zhuǎn)化為另一種編碼的例子。***,我們將一起看一看如何在 Linux 下將使用各種字符編碼的文件轉(zhuǎn)化為 UTF-8 編碼。
你可能已經(jīng)知道,計(jì)算機(jī)除了二進(jìn)制數(shù)據(jù),是不會(huì)理解和存儲(chǔ)字符、數(shù)字或者任何人類能夠理解的東西的。一個(gè)二進(jìn)制位只有兩種可能的值,也就是 0 或 1,真或假,是或否。其它的任何事物,比如字符、數(shù)據(jù)和圖片,必須要以二進(jìn)制的形式來表現(xiàn),以供計(jì)算機(jī)處理。
簡單來說,字符編碼是一種可以指示電腦來將原始的 0 和 1 解釋成實(shí)際字符的方式,在這些字符編碼中,字符都以一串?dāng)?shù)字來表示。
字符編碼方案有很多種,比如 ASCII、ANCI、Unicode 等等。下面是 ASCII 編碼的一個(gè)例子。
- 字符 二進(jìn)制
- A 01000001
- B 01000010
在 Linux 中,命令行工具 iconv 用來將使用一種編碼的文本轉(zhuǎn)化為另一種編碼。
你可以使用 file 命令,并添加 -i 或 --mime 參數(shù)來查看一個(gè)文件的字符編碼,這個(gè)參數(shù)可以讓程序像下面的例子一樣輸出字符串的 mime (Multipurpose Internet Mail Extensions) 數(shù)據(jù):
- $ 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 編碼轉(zhuǎn)換為 UTF-8 編碼
下面,我們將學(xué)習(xí)如何將一種編碼方案轉(zhuǎn)換為另一種編碼方案。下面的命令將會(huì)將 ISO-8859-1 編碼轉(zhuǎn)換為 UTF-8 編碼。
考慮如下文件 input.file,其中包含這幾個(gè)字符:
- � � � �
我們從查看這個(gè)文件的編碼開始,然后來查看文件內(nèi)容。***,我們可以把所有字符轉(zhuǎn)換為 UTF-8 編碼。
在運(yùn)行 iconv 命令之后,我們可以像下面這樣檢查輸出文件的內(nèi)容,和它使用的字符編碼。
- $ 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 轉(zhuǎn)化為 UTF-8
注意:如果輸出編碼后面添加了 //IGNORE 字符串,那些不能被轉(zhuǎn)換的字符將不會(huì)被轉(zhuǎn)換,并且在轉(zhuǎn)換后,程序會(huì)顯示一條錯(cuò)誤信息。
好,如果字符串 //TRANSLIT 被添加到了上面例子中的輸出編碼之后 (UTF-8//TRANSLIT),待轉(zhuǎn)換的字符會(huì)盡量采用形譯原則。也就是說,如果某個(gè)字符在輸出編碼方案中不能被表示的話,它將會(huì)被替換為一個(gè)形狀比較相似的字符。
而且,如果一個(gè)字符不在輸出編碼中,而且不能被形譯,它將會(huì)在輸出文件中被一個(gè)問號(hào)標(biāo)記 ? 代替。
將多個(gè)文件轉(zhuǎn)換為 UTF-8 編碼
回到我們的主題。如果你想將多個(gè)文件甚至某目錄下所有文件轉(zhuǎn)化為 UTF-8 編碼,你可以像下面一樣,編寫一個(gè)簡單的 shell 腳本,并將其命名為 encoding.sh:
- #!/bin/bash
- ### 將 values_here 替換為輸入編碼
- FROM_ENCODING="value_here"
- ### 輸出編碼 (UTF-8)
- TO_ENCODING="UTF-8"
- ### 轉(zhuǎn)換命令
- CONVERT=" iconv -f $FROM_ENCODING -t $TO_ENCODING"
- ### 使用循環(huán)轉(zhuǎn)換多個(gè)文件
- for file in *.txt; do
- $CONVERT "$file" -o "${file%.txt}.utf8.converted"
- done
- exit 0
保存文件,然后為它添加可執(zhí)行權(quán)限。在待轉(zhuǎn)換文件 (*.txt) 所在的目錄中運(yùn)行這個(gè)腳本。
- $ chmod +x encoding.sh
- $ ./encoding.sh
重要事項(xiàng):你也可以使這個(gè)腳本變得更通用,比如轉(zhuǎn)換任意特定的字符編碼到另一種編碼。為了達(dá)到這個(gè)目的,你只需要改變 FROM_ENCODING 及 TO_ENCODING 變量的值。別忘了改一下輸出文件的文件名 "${file%.txt}.utf8.converted".
若要了解更多信息,可以查看 iconv 的手冊(cè)頁 (man page)。
- $ man iconv
將這篇指南總結(jié)一下,理解字符編碼的概念、了解如何將一種編碼方案轉(zhuǎn)換為另一種,是一個(gè)電腦用戶處理文本時(shí)必須要掌握的知識(shí),程序員更甚。
***,你可以在下面的評(píng)論部分中與我們聯(lián)系,提出問題或反饋。