2014年7月アーカイブ

UTF-8のCSVファイルを扱うプログラムが理由のわからないエラーを出したとき、原因が入力ファイルのBOMだったことがあります。

1行目の先頭にU+FEFFがついていて、ファイルを読み込む処理でそれを落とさなかったために、U+FEFFもデータの一部として扱われてしまったためです。つまり最初のレコードの最初のフィールドにゴミがついてしまったわけです。

この問題が厄介なのは、データの中身をテキストエディタやコンソールで見てもよくわからないことです。U+FEFFは "ZERO WIDTH NO-BREAK SPACE" であって目に見えない存在であるので、ソフトウェアがきちんと対応しているほど、存在が隠れてしまうわけです。いっそ豆腐にでもなってくれれば異常に気付きやすいのですが。

(余談ながら、ネットのジョークに「お前のコードに全角スペースを入れたぞ」「なにー」みたいなのがありますが、和字間隔(全角スペース)は可視化するエディタも多く、昔からよく知られているだけに対処も容易であって、U+FEFFやその他Unicodeの制御文字の類いの方がずっと面倒です)

ここで、もし、CSVファイルの1行目がヘッダ行であって、なおかつそのヘッダ行を(あるいは少なくともヘッダの先頭の項目を)単に読み飛ばすようになっていると、BOMがあろうがなかろうが同じことになります。

つまり、たいして必要でなくても(というかむしろ必要でない方が好都合)、ヘッダ行を設けておくと、BOMよけとして働いてくれるわけです。

もっとも、本当は、UTF-8のファイル先頭のBOM (バイト列 EF BB BF) をプログラムが読み飛ばすようになっている方がいいわけで、これはあまりちゃんとした対処ではありません。

参考:

広告