處理以 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 程式喜歡新增這些標記。大多數編輯不會刪除這些標記。

相關內容