web-dev-qa-db-ja.com

BOM(FF FE)で始まるファイルを処理する

FF FE BOMを含む.csvファイルを受け取りました:

$ 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で同じ文字列を検索すると、すべての文字の一致が表示されます!

iconvを使用してASCIIに変換すると、\ 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を使用して)スワップして、通常のツールで使用できるようにするにはどうすればよいですか?

10
dotancohen

これから ウィキペディアの記事FF FEUTF16LEを意味します。したがって、iconvUTF16LEからUTF8に変換するように指示する必要があります。

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

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
nisetama

StackOverflowでも回答: BOMをUTF-8ファイルから削除するにはどうすればよいですか?@ rici は良い答えです。

短い答え:

  • 短い答え: sed -i $'1s/^\uFEFF//' file.txt、ただしBSDまたはOS/Xでは使用できません。
  • 別の答え:vi file.txt:set nobomb:w、シンプルだが手動
  • Dos2unuixをインストールします。 dos2unix -r file.txt
  • これらのマークには、ファイルがUTF-8であることだけを含め、いくつかの可能な意味があります。 Wikipedia Article を参照してください。
  • Windowsプログラムは、これらのマークを追加するのが大好きです。ほとんどの編集者はこれらのマークを削除しません。
0
Charles Merriam