File 将文件从带CRLF行终止符的Little-endian UTF-16 Unicode英文文本转换为Ascii编码

File 将文件从带CRLF行终止符的Little-endian UTF-16 Unicode英文文本转换为Ascii编码,file,unix,awk,encoding,character-encoding,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行终止符,

非常感谢所有在我之前的场景中帮助过我的人。我相信有人会像以前一样问类似的问题。这是我的问题

我的文件属于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”

Per:

默认情况下,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字符,您将得到一个显式错误,而不是错误的输出。)

除了您不想要BOM表外,一切正常吗?理想情况下,它必须是ASCII英文文本如果所有字符都在ASCII范围内,UTF8将完全等同于ASCII(
可能更好的问题是,如果需要ASCII,为什么要告诉
iconv
转换为UTF-8?这可能是输入文件的BOM表。如果是,请尝试删除它。