File 将文件从带CRLF行终止符的Little-endian UTF-16 Unicode英文文本转换为Ascii编码
非常感谢所有在我之前的场景中帮助过我的人。我相信有人会像以前一样问类似的问题。这是我的问题 我的文件属于Little endian UTF-16 Unicode英文文本,带有CRLF行终止符编码,但我看不出它适用于我们的文件标准。通常我看到这里属于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行终止符,
我使用了
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表。如果是,请尝试删除它。