我收到了带有 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
从 转换UTF16LE
为UTF8
:
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 程序喜欢添加这些标记。大多数编辑不会删除这些标记。