UTF-8のファイルを扱う際に、BOMの有り/無しに気をつけるべき理由

UTF-8のcsvファイルをJavaで扱っていたのですが、どうも読み込み時にゴミのようなものが含まれているよう。。

csvファイルを読み込んで、1行ずつJavaのオブジェクトに変換しているのだが、最初のレコードだけそのようになっている。

テキストエディタで開いて確認しても、特に問題があるようには見えず、余計な情報も含まれているようには見えない。。。

あれこれ調査した結果、UTF-8のファイルがBOM付きになっていると不具合が起きてしまうことが判明しました。

そもそも、UTF-8における、BOMの有り/無しですが、どう違うかというと、、、

目次

BOMとは

バイト順マーク(Byte Order Mark)の略。文書ファイルの先頭に付ける「0xEF 0xBB 0xBF」という3バイトのバイナリデータである。

もともと、UTF-16のような8ビットでは収まらないunicodeデータを扱う際に、バイト順(Byte Order)を明示するために、ファイルの先頭に付けた識別子のようなもの。

8ビットで収まるUTF-8では特に必須ではないが、「このファイルの文字オードはUTF-8ですよ」ということを読み込むプログラムに通知してあげる意味に使われている。

この識別子は付いているものがUTF-8のBOM有り、付いていないものがUTF-8のBOM無し(UTF-8Nと表記される)となる。

読み込むプログラムによってBOMが必要なものと必要無いものがある。

ということのようです。

テキストエディタは、BOMの有り/無しを自動で判別し、どちらのファイルも正常にひらけるものが多いため、見た目では違いが分からないので、注意が必要です。

見た目全く同じ文字列なのにもかかわらず、プログラム側でゴミのようなものが付いていたり、不具合が起こる場合には、BOMの有り/無しをチェックしてみるといいかもしれません。