%20%E9%96%8B%E9%A0%AD%E7%9A%84%E6%96%87%E4%BB%B6.png)
我收到了帶有 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 程式喜歡新增這些標記。大多數編輯不會刪除這些標記。