こんにちは、さち です。
ウェブサイトの制作では、文字化け防止のため文字コードを「UTF-8」にするのが一般的。
よーし! 「UTF-8」でサイト作っちゃうぞー! ファイルを「UTF-8」で保存すればいいだけでしょ?
えっ、「BOM」? 何それ意味分かんないんだけど……。
「BOM」ってなに?
テキストファイルによく使われる文字コード「UTF-8」には、「BOM」という仕組みがあります。
「BOM」とは、「バイトオーダーマーク(Byte Order Mark)」の略で、ファイルの文字コードが「UTF-8」であることを示します。(バイナリの先頭に付いてる「EF BB BF」が BOM)
簡単に言うと、「UTF-8 で文字を書いたよ」と PC に知らせるものです。
「BOM」を付ける/付けないは任意なので、テキストエディタ によっては保存時にその選択ができます。(画像は「Mery」の保存画面)
一方、「メモ帳」は「BOM」の有無を選択できません。自動で「BOM」が付加されます。
ちなみに、BOM無しのUTF-8を「UTF-8N」と呼ぶこともあります。(日本でしか使われない表現らしい)
「テキスト」で真っ先に思い浮かぶのは「メモ帳」で書くような一般的なテキストファイル(拡張子:txt)ですが、中身がテキストで構成されているファイルはウェブにもあります。
例えば、「HTML」「CSS」「JavaScript」「PHP」などです。これらのファイルも文字コードを「UTF-8」にすれば、当然「BOM」が関わってきます。
ウェブ制作では「BOM」を付けた方がいいの?
結論から言うと、「BOM」は付けない方がよいです。
「BOM」付けると動作や表示に不具合が出る可能性があるからです。(PHP で謎の空白ができてしまう など)
「BOM」無しだと、一部のブラウザやソフトでソースを見るときに誤った文字コードで表示されることがありますが、通常のウェブページ閲覧には何も問題ありません。
もちろん、HTML や CSS は文字コードを明記しましょう。
余談 - BOMの本来の役割
Unicode など、少し踏み込んだ内容なので、興味がない人は読み飛ばして下さい。
Unicode は「文字セット(符号化文字集合)」と呼ばれるもので、使用できる文字の定義です。
そして、この Unicode の各文字に番号を割り当てるのが、UTF-8 をはじめとする「文字コード(符号化方式)」です。UTF-8 以外にも UTF-16, UTF-32 が存在します。
UTF-16, UTF-32 は、コンピュータの構造によってエンディアン(バイトオーダー)の方式に違いがあり、「ビッグエンディアン」と「リトルエンディアン」の2種類が存在しています。
そして、この「エンディアン(バイトオーダー)」の判別に BOM(バイトオーダーマーク) を使用します。
しかし、UTF-8 にエンディアンの違いは存在しません。つまり、UTF-8 にとって BOM は必要ないものです。(BOM を付けることも「許容」しているだけ)
そのため、UTF-8 に BOM が付くことを想定しないものでは、BOM が不具合の原因になる場合があるわけです。
ただし、「Excel」「メモ帳」などの Microsoft のアプリでは、逆に「BOM」を付けないと不具合が出ることがあります。「メモ帳」が強制的に「BOM」を付ける理由はこれなのでしょう。
BOM の有無について、どちらかに統一して欲しいですね。
コメント
非常にためになりました
ありがとうございます
Visual Studio + Qt でデスクトップ アプリを開発していますが Qt 側はUTF-8なのにVisual StudioのコンパイラがBOMがないUTF-8だと 警告を出力し厄介です
要はMSの仕様が世間様と異なるのでしょうね