今回は、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に記述すれば、この問題は解決されるはず。
1 2 3 |
file.resource.loader.skipBOM=true input.encoding=UTF-8 output.encoding=UTF-8 |
Apache Velocityは練られていました。
テキストエディタについてのおすすめの本
皆さんはテキストエディタは何を使っていますか?
少し前までなら「秀丸エディタ」、あるいは「サクラエディタ」あたりでしょうか?
最近は、「Atom」が流行っていますね。
↓テキストエディタに関するおすすめの本はコチラ
コメント
[…] […]
[…] ・https://urashita.com/archives/819 […]