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、大量の null バイトが返されますが、これはバイト順序が原因と思われます。このファイルのバイト順序を (CLI を使用して) 入れ替えて、通常のツールで処理できるようにするにはどうすればよいでしょうか。

このファイルは ASCII 文字のみ (BOM を除く) であると思われますが、grepバイナリ ファイルであるかどうかは確認できません。

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

VIMで同じ文字列を検索すると、すべての文字マッチング!

ASCII に変換するために を使用してiconvも \x00 値は削除されず、UTF-8 ではなく null バイトのように見えるため、実際には問題が悪化します。

$ 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

dos2unixUTF-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 を削除するにはどうすればよいですか? リシ良い答えがあります。

短い答え:

  • 短い答え:sed -i $'1s/^\uFEFF//' file.txtただし、BSD または OS/X ではそうではありません。
  • 別の答え: vi file.txt、、、:set nobombシンプル:wだが手動
  • dos2unuix をインストールします。dos2unix -r file.txt
  • これらのマークには、ファイルがUTF-8であることを示すものも含め、いくつかの意味があります。Wikipedia記事
  • Windows プログラムはこれらのマークを追加するのが大好きです。ほとんどのエディターはこれらのマークを削除しません。

関連情報