我的文件属于 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>
答案 0 :(得分:0)
这里的问题是BOM是'UTF-16'的功能,而不是'UTF-16LE'的功能。
每http://unicode.org/faq/utf_bom.html#gen7:
BE形式使用大端字节序列化(最高有效字节在前),LE形式使用小端字节序列化(最低有效字节在前),未标记形式默认使用大端字节序列化,但可能包括开头有一个字节顺序标记,指示实际使用的字节序列化。
请注意,包含字节顺序标记的选项仅适用于“未标记形式”,即'UTF-16'。
因此,当您告诉iconv
源编码为'UTF-16LE',然后输入以FFFE开头时,iconv
不会将FFFE解释为字节顺序;而是将其解释为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字符,您将得到显式错误而不是错误的输出。)