Contents

使用Iconv将UTF-16LE转换为UTF-8

1. 概述

首先,让我们从计算机如何解释数据开始。计算机只理解二进制系统约定,这意味着所有信息都将以二进制格式转换和存储,并在显示时重新转换为人类可读的格式。这种将人类语言中的字符转换为二进制序列的过程称为编码。

ASCII 、UTF-16LE、UTF-8 都是常用的编码方案。由于可用的编码方案多种多样,我们经常会觉得需要根据目标系统交换文件编码格式。

在本教程中,让我们学习如何使用iconv  工具在任何 Linux 系统中转换编码格式。

2. 如何检查任何给定文件的编码方案

iconv工具将数据从一种编码方案转换为另一种编码方案。在转换任何文件的编码方案之前,第一步是识别当前的编码方案并验证目标和源编码方案是否与iconv工具兼容。

首先,让我们学习如何检查任何给定文件的编码格式。file 实用程序将在确定文件的属性时派上用场。要识别任何文件的编码方案:

$ file -i test.csv
test.csv: text/plain; charset=utf-8

3. 支持的编码方案列表

在我们学习转换编码方案之前,让我们学习如何在 iconv 工具中检查所有支持的编码方案。iconv -l 或 iconv –list 将列出我们支持的一堆编码方案:

$ iconv -l
437, 500, 500V1, 850, 851, 852, 855, 856, 857, 860, 861, 862, 863, 864, 865,
...
CP920, CP921, CP922, CP930, CP932, CP933, CP935, CP936, CP937, CP939, CP949

最后,我们应该确保我们的目标和源编码方案 在转换之前与iconv 工具兼容。

4. 转换任何给定文件的编码方案

最后,让我们学习如何转换任何给定文件的编码方案。在找到当前的编码方案(使用文件工具)并确保目标和源编码方案都与 iconv实用程序兼容之后,我们将继续进行实际转换的这一步。将 UTF-16LE 编码文件转换为 UTF-8 的步骤如下。

我们首先找到文件的输入编码方案:

$ file -i input.csv 
input.csv: text/plain; charset=utf-16le

其次,让我们验证目标(UTF-8)和源编码方案(UTF-16LE)是否与iconv工具兼容:

$ iconv -l | grep -i utf-16le 
UTF-16LE// 
$ iconv -l | grep -i utf-8 
ISO-10646/UTF-8/ 
UTF-8//

最后,让我们将输入文件转换为我们的目标 UTF-8 格式,并验证结果文件的编码方案:

$ iconv -f utf-16le -t utf-8 input.csv -o result.csv
$ file -i result.csv result.csv: text/plain; charset=utf-8

5. 输入输出编码格式输入

iconv 工具需要源的编码格式(通过-f 选项)和目标编码格式(通过*-i*选项)。

如果 -f 和 -i 选项都不存在,则输出文件只是输入文件而不执行任何转换:

$ file -i test.csv 
test.csv: text/plain; charset=utf-8
$ iconv test.csv -o result.csv
$  file -i result.csv 
result.csv: text/plain; charset=utf-8
$ diff test.csv result.csv

如果*-i选项不存在,则iconv*工具会识别输入文件的编码格式并将其转换为目标编码方案:

$ iconv -t utf-16le test.csv -o result.csv
$ file -i result.csv 
result.csv: text/plain; charset=utf-16le

简而言之,如果没有 from-encoding 参数,那么默认是从当前语言环境的字符编码派生的。类似地,如果没有 to-encoding 参数,则默认值是从当前语言环境的字符编码派生的。

6. 重定向输出

标准输出是默认输出选项:

$ iconv -t utf-16le test.csv
��,,,
,,,
,,,
EMPLOYEE CLAIM FORM,,,
,,,
LEAVE TRAVEL ALLOWANCE,,,
,,,
,,,
,,,
,,,
SL.NO.,PARTICULARS,,REMARKS

要将输出定向到文件,我们有以下方法。使用管道命令(或 -o 选项)重定向:

$ iconv -t utf-16le test.csv > result.csv
$ cat result.csv 
��,,,
,,,
,,,
EMPLOYEE CLAIM FORM,,,
,,,
LEAVE TRAVEL ALLOWANCE,,,
,,,
,,,
,,,
,,,
SL.NO.,PARTICULARS,,REMARKS

7. 省略无效字符

由于内存损坏或传输不当,输入文件可能包含一些无效字符。在这种情况下,我们可以使用*-c选项指示iconv*工具忽略无效字符:

$ cat input_invalid 
hi😀😀This is not a valid char
$ iconv -f us-ascii -t utf-8 input_invalid -c -o output
$ cat output 
hiThis is not a valid char

上图显示iconv工具完全转换了所有有效字符,只忽略了无效字符。