从Little-endian UTF-16 Unicode英文文本转换文件,使用CRLF行终止符转换为Ascii编码

时间:2017-09-26 09:30:00

标签: file unix awk encoding character-encoding

非常感谢在我以前的场景中帮助过我的每个人。我很确定有人会问过类似的问题。这是我的问题。

我的文件属于 Little-endian UTF-16 Unicode英文文本,带有CRLF行终止符编码,但我认为它不适用于我们的文件标准。通常我在这里看到属于 ASCII英文文本。我如何将其转换为它。

我使用了iconv -f UTF-16LE -t UTF-8 myfile.dat -o myfile.dat_test,但它将整个文件转换为 UTF-8 Unicode(带BOM)英文文本,使用CRLF行终止符,不太确定在哪里发生了什么。< / p>

1 个答案:

答案 0 :(得分:0)

这里的问题是BOM是'UTF-16'的功能,而不是'UTF-16LE'的功能。

http://unicode.org/faq/utf_bom.html#gen7

BE形式使用大端字节序列化(最高有效字节在前),LE形式使用小端字节序列化(最低有效字节在前),未标记形式默认使用大端字节序列化,但可能包括开头有一个字节顺序标记,指示实际使用的字节序列化。

请注意,包含字节顺序标记的选项仅适用于“未标记形式”,即'UTF-16'。

因此,当您告诉iconv源编码为'UTF-16LE',然后输入以FFFE开头时,iconv不会将FFFE解释为字节顺序;而是将其解释为U + FEFF零宽度无间断空格,并尝试将该字符复制到输出中。

您可以通过告诉iconv源编码为'UTF-16'来解决此问题;然后,当看到输入以FF FE开头时,它将解释为字节顺序标记,将其删除,并将其余输入解释为little-endian。

因此,请更改此内容:

iconv -f UTF-16LE -t UTF-8 myfile.dat -o myfile.dat_test

对此:

iconv -f UTF-16 -t US-ASCII myfile.dat -o myfile.dat_test

(注意:我还将'UTF-8'更改为'US-ASCII',因此,如果存在任何非ASCII字符,您将得到显式错误而不是错误的输出。)