%20%E3%81%A7%E5%A7%8B%E3%81%BE%E3%82%8B%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%92%E5%87%A6%E7%90%86%E3%81%99%E3%82%8B.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
、大量の 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
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 を削除するにはどうすればよいですか? リシ良い答えがあります。
短い答え:
- 短い答え:
sed -i $'1s/^\uFEFF//' file.txt
ただし、BSD または OS/X ではそうではありません。 - 別の答え:
vi file.txt
、、、:set nobomb
シンプル:w
だが手動 - dos2unuix をインストールします。
dos2unix -r file.txt
- これらのマークには、ファイルがUTF-8であることを示すものも含め、いくつかの意味があります。Wikipedia記事。
- Windows プログラムはこれらのマークを追加するのが大好きです。ほとんどのエディターはこれらのマークを削除しません。