mac*_*ine 7 unix awk encoding file 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 行终止符,不太确定发生了什么。
这里的问题是 BOM 是“UTF-16”的功能,而不是“UTF-16LE”的功能。
\n根据http://unicode.org/faq/utf_bom.html#gen7:
\n\n\nBE 形式使用大端字节序列化(最高有效字节在前),LE 形式使用小端字节序列化(最低有效字节在前),无标记形式默认使用大端字节序列化,但可能包括字节顺序开头的标记表示实际使用的字节序列化。
\n
请注意,包含字节顺序标记的选项仅适用于“未标记的形式”,即“UTF-16”。
\n因此,当您告诉iconv源编码是“UTF-16LE”,然后输入以 FF\xc2\xa0FE 开头时,iconv不会将 FF\xc2\xa0FE 解释为字节顺序的冗余指示;相反,它会将其解释为 U+FEFF ZERO WIDTH NO-BREAK SPACE,并尝试将该字符复制到输出。
您可以通过告知iconv源编码为“UTF-16”来解决此问题;然后,当它看到输入以 FF\xc2\xa0FE 开头时,它会将其解释为字节顺序标记,将其删除,并将输入的其余部分解释为小端。
所以,改变这个:
\niconv -f UTF-16LE -t UTF-8 myfile.dat -o myfile.dat_test\nRun Code Online (Sandbox Code Playgroud)\n对此:
\niconv -f UTF-16 -t US-ASCII myfile.dat -o myfile.dat_test\nRun Code Online (Sandbox Code Playgroud)\n(注意:我还将“UTF-8”更改为“US-ASCII”,这样如果有任何非 ASCII 字符,您将得到一个明确的错误,而不是错误的输出。)
\n