处理以BOM表(FF FE)开头的文件


10

我收到了带有FF FEBOM 的.csv文件:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

当使用awk它解析时,我得到了一堆空字节,我怀疑这是由于字节顺序所致。如何交换该文件上的字节顺序(使用CLI),以便普通工具可以使用它?

请注意,我认为该文件仅是ASCII字符(BOM除外),但是我不能确认grep它是二进制文件:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

在VIM中搜索相同的字符串会显示每个匹配的字符

使用iconv转换为ASCII不会摆脱\ x00值,实际上,这使问题变得更糟,因为它们现在看起来像空字节而不是UTF-8!

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

如何交换该文件的字节顺序(使用CLI),以便普通工具可以使用它?


您在Windows或Mac中创建的CSV文件?
cuonglm

您可以提供一部分文件吗?
cuonglm

这是指向文件匿名部分的链接,该链接保留了文件的唯一问题。谢谢!
dotancohen 2014年

Answers:


16

从这篇维基百科文章中FF FE意味着UTF16LE。因此,您应该告诉iconv将from转换UTF16LEUTF8

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt

完美,谢谢!我将UTF-8和UTF-16 BOM混合在一起:我以为FFFE和FEFF是UTF-8,但我从不知道UTF-16 BOM。实际上,这些是UTF-16 BOM,我从不知道(无用的)UTF-8 BOM!
dotancohen 2014年

@dotancohen:我在Fedora中进行了测试,该tail解决方案效果很好。您使用什么操作系统?
cuonglm 2014年

在Windows上的Git Bash中,版本“ iconv(GNU libiconv 1.14)”不起作用(即,删除BOM)。但是(无论出于何种原因)仅使用UTF-16而不使用字节顺序版本之一即可。
肯尼·埃维特

3

dos2unix 还删除BOM并将UTF-16转换为UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unix 还删除了UTF-8 BOM:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61

0

在StackOverflow上也得到了回答: 如何从UTF-8文件中删除BOM? @rici有一个很好的答案。

简短答案:

  • 简短的答案:sed -i $'1s/^\uFEFF//' file.txt,但不是在BSD或OS / X上。
  • 另一个答案:vi file.txt:set nobomb:w,简单,但手动
  • 安装dos2unuix; dos2unix -r file.txt
  • 这些标记具有多种可能的含义,其中包括文件为UTF-8。请参阅Wikipedia文章
  • Windows程序喜欢添加这些标记。大多数编辑器不会删除这些标记。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.