コードの品質チェックでBOMーUTF8が発見されたので
Webページをあたっていくつかピックアップ。
なるほど、即刻直すべき、、、と。
Javaで書かれた処理プログラムがUTF-8のテキストを読み込む際に、BOMを消費せずに単なるUnicode文字のように扱うため、1行目のデータの先頭にゴミが付いた状態になっていたのです。それで、見えないゴミ付きのデータになってしまい、意図どおりに動作しないし、テキストエディタで開いてみても異常に気付かなかったわけです。
JavaのライブラリでUTF-8のテキストを読み込むとき、先頭にBOMがあると、それを単なるU+FEFFという符号位置の文字データとして読み込んでしまいます。本来のBOMは、Byte Order Markという名前のとおり、バイト順を示す役割のものであって、文字を符号化したデータの一部ではありません。UTF-16/32と違ってバイト順の問題のないUTF-8にBOMを付けるべきかという問題は議論が分かれるところかもしれません。しかし現実にはBOM付きUTF-8は生成されることがあります。
ウェブ検索で「java utf-8 bom」などとしてみると、BOM付きUTF-8をJavaで読み込んでトラブルになった話が複数出てきたり、また互換性のためにJavaではUTF-8読み込み時の挙動を変える予定はなさそうだという話が出てきたりします。
Javaで、UTF-8文書を扱う時に具体的に注意するシーン †
Javaプログラムで独自形式の設定ファイルの読み込むとき
JavaプログラムでXML文書を読み込む時
Windows の notepad(メモ帳) は、BOM付きのUTF-8 形式でファイルを記録するので、notepad(メモ帳)では、これらの文書を編集してはいけない
うん、なるほど!