BOM(バイトオーダーマーク)死すべし。慈悲は無い。
BOM って何?
こちらが Wikipedia です。
なんで消すの?
csv.DictReader とか使ってるとヘッダの頭に BOM がつくので、1行目 seq とかで取り込むと思ってたら <0xEF>seq
みたいなヘッダが出来上がりますね。
どうやって消す?
- nkf で消せばいいと思います。
- プログラム側で消してもいいかもしれません。
コマンドラインで消す
$ nkf --overwrite -oc=UTF-8 filename
こっちが王道だと思います。読み込む前から消しておけばどうということはない。
アプリケーション側で消す
必ずしも取り込み前に消せるとは限らないので。
import codecs
def strip_bom(s):
s = s.encode('utf8')
if s.startswith(codecs.BOM_UTF8):
return s[len(codecs.BOM_UTF8):].decode('utf8')
return s.decode('utf8')
codecs
モジュールに BOM_UTF8
という定数が用意されてるのに open
のオプションとかで消せないの何故なんだぜ?