UTF-8 ドキュメントの BOM を削除する

先日 UTF-8 で記述したシェルスクリプトが実行できないということがありました。BOM が付いていたことが原因だったのですが、その削除に関するメモを残しておきます。

BOM の確認は UTF-8 の場合、先頭 3 バイトの 0xEF 0xBB 0xBF を確認します。


$ od -t x1 hoge.xml
0000000 ef bb bf 3c 78 6d 6c 20 76 65 72 73 69 6f 6e 3d
...

VIM の場合は、


:set nobomb
:w
にて、BOM を消して保存します。

perl の場合は、


$ perl -0 -i.bak -pne 's/^\xEF\xBB\xBF//' hoge.xml
となります。-0 はレコードセパレータ $/ を 8 進数で指定しますが、指定しない場合はファイル全体を読み込みます。

BOM 付きと既に分かっている場合 tail を


$ L=`cat hoge.xml | wc -c` && tail -c `expr $L - 3` hoge.xml > hoge_new.xml
のように使う方法もあります。

森田