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

シェアする

  • このエントリーをはてなブックマークに追加

今回は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は練られていました。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です