UTF-8のBOM付き、BOM無しについて教えてもらったのでメモ。(間違いがあれば指摘して下さい)


まず、結論から言うとWeb屋さんは「UTF-8 BOM無し」で使うべきみたいです。具体的にどういう時にエラーが出たりしてハマるケースはいくつかあるみたいです。

htmlファイルの文字コードをUTF-8 BOM付きにすると、htmlファイルを読み込むときにお馴染みの
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

よりも先に、BOMの情報が読み込まれるのがダメみたいです。


あと、PHPを使うときも注意が必要と教えてもらいました。
BOM (Byte Order Mark)付きのUTF-8のファイルは、
EF BB BF の3バイトを画面に出力することになり、 header() が効かなくなる。
ブラウザによっては、レイアウトが崩れる場合もある。
UTF-8からSJIS-winへ変換する際に注意すること。
・引用元:PHP × Ajax = CMS » [PHP] UTF-8のBOMを削除


ちなみに、UTF-8 におけるBOMの役割は"バイト順マーク"の本来の意味とは違う使われ方をしているみたいです。単に文字コードがUTF-8かどうかの判別に利用されているようです。
■UTF-8のバイト順マークの使用について

UTF-8で符号されたテキストデータはエンディアンに関わらず同じ内容になるので、バイト順マーク(BOM)は必要ない。しかし、テキストデータがUTF-8で符号化されていることの標識として、データの先頭にEF BB BF を付加することがある。

なお、このシーケンスがある方をUTF-8、ない方をUTF-8Nと呼ぶこともあるが、このような呼び分けは日本以外ではほとんど知られておらず、また公的規格などによる裏付けもない。

このため、UTF-8という呼び名を使っていれば情報交換の相手が文書先頭にこのシーケンスがあると見なすと期待すべきではないし、いっぽう、UTF-8Nという呼び名は情報交換の際に用いるべきではない。

このシーケンスを通常の文字と認識するプログラムでは、先頭に余分なデータがあるとみなされて問題となることがある。

逆にこのシーケンスがないとUTF-8と認識できないプログラムも存在する。
・一部抜粋:UTF-8 - Wikipedia

他にも、文字コード関連の知識は「読み物 | ウナのIT資格一問一答」に分かりやすく書かれていたのでメモ。

Shift_JIS、CP932、MS932、Windows-31J
Unicode ~UTF-8、UTF-16との違い~
Unicode ~エンディアンとBOM~
Unicode ~UCS-4とUCS-2~ | 読み物 | ウナのIT資格一問一答
Unicode ~ユニコードエスケープ形式とは~

文字コード関連についてちゃんとまとめられているサイトって意外と少ないんですよねぇ。

以上、簡単ですが「UTF-8 BOM無し/付き」についての忘備録的なエントリでした。