BOM(バイトオーダーマーク, byte order mark, ボム)ではまった話

バイトオーダーマーク BOM

今回は、BOM(バイトオーダーマーク, byte order mark, ボム)の話です。

スポンサーリンク
スポンサーリンク

BOM(バイトオーダーマーク, byte order mark, ボム)って何?

BOMとは、Unicodeのテキストの先頭に付けるバイトデータのことです。

UTF-8の場合は、0xEF 0xBB 0xBF がテキストデータの先頭に付けられます。

UnicodeがはじまったころはアメリカではASCII、ヨーロッパなどではISO-8859、日本ではShift_JISやEUC-JPが主流であり、使用されている符号化方式がUnicodeであることを明確に区別する必要があった。その方法として、先頭のデータにテキスト以外のデータを入れることが発案された。

(Wikipediaより)

正直、テキストファイルの先頭に識別子がつくのは違和感を感じますが、背景は理解はできます。

BOM(バイトオーダーマーク)ではまった話

以前、プロジェクトでApacheの Velocity というプロジェクトを使っていました。

Apache Velocityは一言でいえば、テンプレートエンジンで、サーバーサイドのJavaコードをWebのページと切り離して実装することができます。

使ってみるとわかる便利なライブラリです。

Apache Velocityを使ってメールを送るサービスを作ったのですが、メールのタイトルの先頭に必ず「?」というマークがついて文字化けしてしまします。

テンプレートの中身を調べた結果、どうやら、メモ帳・notepadでメールテンプレートのファイルをUTF-8で保存した時のみこの現象が発生することがわかりました。

現象を一言で説明すると以下の通りです。

メモ帳・notepadを開いて下記のようなファイルを作成します。

GW-00662

このファイルをUTF-8で保存します。

image

メモ帳・notepadでファイルを保存するときに、文字コードとして「UTF-8」を選択して保存します。

このようにして保存すると、必ずBOMが先頭に付いて保存されます

バイナリエディタ Stirling でこのファイルを開いてみると以下の通りです。

image

0xEF 0xBB 0xBFが先頭に入っていることがわかります。

結果として、

Apache VelocityがUTF-8のBOMを解釈できずにそのままメールを送ったので文字化けが発生したらしい

とわかりました。

ちなみに、サクラエディタではUTF-8で保存する際、BOM付きとBOMなしの両方で保存することが可能です。

image

というわけで結論。

notepadでUTF-8でファイルを保存すると必ず、BOMが先頭に付く

ま、仕様だから仕方ないか。

ところで、Apache Velocityですがよくよく調べてみると、velocity.propertiesにちゃんとパラメーターが用意されていました。

file.resource.loader.skipBOMです。

以下のようにvelocity.propertiesに記述すれば、この問題は解決されるはず。

Apache Velocityは練られていました。

テキストエディタについてのおすすめの本

皆さんはテキストエディタは何を使っていますか?

少し前までなら「秀丸エディタ」、あるいは「サクラエディタ」あたりでしょうか?

最近は、「Atom」が流行っていますね。

↓テキストエディタに関するおすすめの本はコチラ

テキストエディタ