UTF-8 の BOM を消す

UTF-8 なファイルに BOM がついていると、 javac でコンパイルが通らなかったり*1 Velocity で結合したときにゴミが入ったりと色々面倒なので、BOM を消すスクリプトを書いてみました。

スクリプトを書くに当たって:

  • ファイルリストを渡すのは find + xargs に任せてます。(面倒だったから!)
    • find, xargs は GnuWin32 を使ってます。
  • optparse を無理やり使ってます。(使ってみたかったから!)


bomdelete.py

# -*- coding: sjis -*-
"""
bomdelete.py
使い方:
 > find -type f -name "*\.html" | xargs python bomdelete.py
 > find -type f -name "*\.txt" | xargs python bomdelete.py
"""

import sys
from optparse import OptionParser

usage = 'find -type f -name "*\.html" | xargs python %prog [-v]'
version = '%prog 0.0.1'
parser = OptionParser(usage=usage, version=version)
parser.add_option(
        '-v', '--verbose',
        action='store_true',
        help=u'BOM削除対象のファイル名を出力します。',
        )

options, args = parser.parse_args()

if len(args) == 0:
    print 'ファイルが指定されていません。'
    sys.exit()

for fname in args:
    buf = open(fname, "rb").read()
    if ['%x' % ord(s) for s in buf[:3]] == ['ef', 'bb', 'bf']:
        if options.verbose == True:
            print fname
        f = open(fname, "wb")
        f.write(buf[3:])
        f.close()


実行結果

D:\temp>python bomdelete.py --help
Usage: find -type f -name "*\.html" | xargs python bomdelete.py [-v]

Options:
  --version      show program's version number and exit
  -h, --help     show this help message and exit
  -v, --verbose  BOM削除対象のファイル名を出力します。

D:\temp>
D:\temp>
D:\temp>python bomdelete.py --version
bomdelete.py 0.0.1

D:\temp>find -type f -name "*\.html" | xargs python bomdelete.py
./XXX/mock/abcd/xyz02101.html
./XXX/mock/abcd/xyz02104.html
./XXX/mock/abcd/xyz02106.html
./XXX/mock/abcd/xyz02109.html
./XXX/mock/abcd/xyz02110.html
./XXX/mock/abcd/xyz02113.html
./XXX/mock/abcd/xyz02114.html
./XXX/mock/abcd/xyz02115.html
./XXX/mock/abcd/xyz02116.html
./XXX/mock/abcd/xyz02201.html
./XXX/mock/abcd/xyz02201.html
./XXX/mock/abcd/xyz02202.html
./XXX/mock/abcd/xyz02204.html
./XXX/mock/abcd/xyz02208.html
./XXX/mock/abcd/xyz02217.html
./XXX/mock/abcd/xyz02218.html
./XXX/mock/abcd/xyz02220.html
./XXX/mock/abcd/xyz05101.html
./XXX/mock/abcd/xyz05104.html
./XXX/mock/abcd/xyz05105.html
./XXX/mock/abcd/xyz05108.html
./XXX/mock/abcd/xyz05109.html
./XXX/mock/abcd/xyz05112.html
./XXX/mock/abcd/xyz05113.html
./XXX/mock/abcd/xyz05114.html
./XXX/mock/abcd/xyz05115.html
./XXX/mock/abcd/xyz05701.html
./XXX/mock/abcd/xyz05701.html
./XXX/mock/abcd/xyz05704.html
./XXX/mock/abcd/xyz05705.html
./XXX/mock/abcd/xyz05707.html
./XXX/mock/abcd/xyz05708.html
./XXX/mock/abcd/xyz05716.html
./XXX/mock/abcd/xyz07501.html

D:\temp>


実行してみて分かったけど GnuWin32 の xargs は長い引数リストを受け取れないみたい(?)。これが残念。


参考にしたサイト

*1:EclipseコンパイラだとなぜかOK