网站搜索

如何在 Linux 中将文件转换为 UTF-8 编码


在本指南中,我们将描述什么是字符编码,并介绍一些使用命令行工具将文件从一种字符编码转换为另一种字符编码的示例。最后,我们将了解如何在 Linux 中将多个文件从任何字符集 (charset) 转换为 UTF-8 编码。

您可能已经想到,计算机无法理解或存储字母、数字或除比特之外我们人类可以感知的任何其他内容。一个位只有两个可能的值,即 01truefalse。所有其他事物,例如字母、数字、图像,都必须以位表示,以便计算机处理。

简而言之,字符编码是一种通知计算机如何将原始零和一解释为实际字符的方法,其中字符由一组数字表示。当我们在文件中键入文本时,我们形成的单词和句子是由不同的字符组合而成的,并且字符被组织成一个字符集

有多种编码方案,例如 ASCIIANSIUnicode 等。下面是 ASCII 编码的示例。

Character  bits
A               01000001
B               01000010

在 Linux 中,iconv 命令行工具用于将文本从一种编码形式转换为另一种编码形式。

您可以使用 file 命令检查文件的编码,并使用 -i--mime 标志来打印 mime 类型字符串,如下例所示:

file -i Car.java
file -i CarDriver.java

使用iconv的语法如下:

iconv option
iconv options -f from-encoding -t to-encoding inputfile(s) -o outputfile 

其中 -f--from-code 表示输入编码,-t--to-encoding 指定输出编码。

要列出所有已知的编码字符集,请运行以下命令:

iconv -l 

将文件从 UTF-8 编码转换为 ASCII 编码

接下来,我们将学习如何从一种编码方案转换为另一种编码方案。以下命令将 ISO-8859-1 编码转换为 UTF-8 编码。

考虑一个名为 input.file 的文件,其中包含以下字符:


� � � �

让我们首先检查文件中字符的编码,然后查看文件内容。紧密地,我们可以将所有字符转换为 ASCII 编码。

运行 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 

注意:to-encoding中添加字符串//IGNORE,会出现无法转换的字符,并显示错误转换后。

同样,假设将字符串 //TRANSLIT 添加到编码中,如上例所示 (ASCII//TRANSLIT),则正在转换的字符将根据需要进行音译(如果可能) 。这意味着如果某个字符无法在目标字符集中表示,则可以通过一个或多个外观相似的字符来近似表示。

因此,任何无法音译且不在目标字符集中的字符都会在输出中替换为问号 (?)

将多个文件转换为 UTF-8 编码

回到我们的主题,要将目录中的多个或所有文件转换为 UTF-8 编码,您可以编写一个名为 encoding.sh 的小 shell 脚本,如下所示:

#!/bin/bash
#enter input encoding here
FROM_ENCODING="value_here"
#output encoding(UTF-8)
TO_ENCODING="UTF-8"
#convert
CONVERT=" iconv  -f   $FROM_ENCODING  -t   $TO_ENCODING"
#loop to convert multiple files 
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 iconv

总结本指南,了解编码以及如何从一种字符编码方案转换为另一种字符编码方案是每个计算机用户的必要知识,对于处理文本的程序员来说更是如此。

最后,如果您有任何问题或反馈,可以通过下面的评论部分与我们联系。