在 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