2015年1月19日月曜日

Windowsのメモ帳で書いたファイルをUTF-8で保存するとなぜBOMがつくのだろう?

Windowsに標準でついてくるエディター「メモ帳」は、今まで特に気にも留めていませんでした。

普段の仕事に使っていたサードパーティー製のエディターソフト(※シェアウェア・有料)がなにやら奇妙な価格体系になったことから、なんかこうあまりバージョンアップやらなんやらでいちいちお財布との相談をするのもいい加減アキアキしてたこともあって、無料で使えるステキなエディターはないかと探っている中でいつのまにかメモ帳もUTF-8を扱えることを発見したのが、コトの発端です。

試しに今まで書いていたPHPのファイルをメモ帳で開き、スクリプト本体とは関係ない適当なコメント行を追加し、上書き保存。
サーバーにアップし動作を見てみると、動かない。
※PHPが全て動作しなくなるわけではないようなのですが、その詳細はここでは割愛。

なんじゃこりゃと思い、使い慣れたエディターで開いてみてみると、なんと「BOM付き」で保存されている。

今までも、「UTF-8で記述されたCSVファイルをエクセルで開くとき、BOMなしで保存されていると文字化けする」というケースには出会ったことがありましたが、BOM自体を気にすることはなかったので、そもそもBOMってなんなのさ、と調べてみました。

乱雑に要約すると、

  • BOMはバイト・オーダー・マーク(Byte Order Mark)の略
  • 言葉通り「バイトの並び順」の意
  • 複数バイトで表されるデータには、[上位バイト][下位バイト]の並びと、[下位バイト][上位バイト]の並びの2つの流儀がある。
  • インテルのCPUは[上位バイト][下位バイト](リトル・エンディアン)の方式を採っている。
  • SunやモトローラのCPUは[下位バイト][上位バイト](ビッグ・エンディアン)の方式を採っている。
  • ファイルごとにそのどちらの方式で表現されたものなのかを示すために、そのファイルの先頭にバイトの並び順を示す数バイトのバイナリ(例:0xEF 0xBB 0xBF)を記述しておき、その方式に合わせて正しくデータを解釈させる。

ということのようです。

メモ帳は、ファイルを保存する際に文字コード:UTF-8を選択することはできますが、BOMの有無は選択できず全てBOM付きで保存されるようです。

メモ帳でWindowsのちょっとしたバッチファイルを書いても、このBOMが原因で動作しないことがあるし、かといってBOMなしで保存されたUTF-8のファイルをメモ帳で開いても、それはそれで特に文字化けもしないし、いったい何のために、、?

いずれにしても、BOMも付くし、LF(改行コード)も改行として表示されないし、PHP書くには当然全く使えないので、今後も引き続き気にも留めませんが「BOMってなにさ?」という好奇心は少し満たされました。

何用途を想定してこの仕様なのかはMicrosoftに限らず、もし知っている人がいれば尋ねてみたいところです。

参照:バイトオーダーマーク - Wikipedia
※「UTF-8においてBOMは容認されるが、必須でも勧められるものでもないとされている」って書いてある。

BOM無しで統一のほうがいんでない?

0 件のコメント: