UTF-8のBOM(バイトオーダーマーク, byte order mark, ボム)とは?文字化けで困った

ITで知っておくべき知識
スポンサーリンク

今回は、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を開いて下記のようなファイルを作成します。

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

 

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

 

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

 

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

 

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

 

結果として、

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

とわかりました。

 

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

 

 

というわけで結論。

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

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

 

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

file.resource.loader.skipBOMです。

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

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

 

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

 

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

 

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

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

 

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

テキストエディタ