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

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

我收到了带有 BOM 的 .csv 文件FF FE

$ 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)以便普通工具可以使用它?

答案1

由此维基百科文章FF FE方法UTF16LE。所以你应该告诉iconv从 转换UTF16LEUTF8

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

答案2

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

答案3

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;看到维基百科文章
  • Windows 程序喜欢添加这些标记。大多数编辑不会删除这些标记。

相关内容