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を使用して)スワップして、通常のツールで使用できるようにするにはどうすればよいですか?
これから ウィキペディアの記事 、FF FE
はUTF16LE
を意味します。したがって、iconv
にUTF16LE
からUTF8
に変換するように指示する必要があります。
iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt
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
StackOverflowでも回答: BOMをUTF-8ファイルから削除するにはどうすればよいですか?@ rici は良い答えです。
短い答え:
sed -i $'1s/^\uFEFF//' file.txt
、ただしBSDまたはOS/Xでは使用できません。vi file.txt
、:set nobomb
、:w
、シンプルだが手動dos2unix -r file.txt