Webフロントエンド - 基礎

BOM(バイト順マーク) ぼむ(ばいとじゅんまーく)

バイト順マークUTF-8文字エンコーディングUnicodeテキストファイル文字化け
BOMって何?ファイルの先頭に変な文字が入るやつ?

簡単に言うとこんな感じ!

そう、まさにそれ!BOMはテキストファイルの一番先頭にこっそり入る「この文字コードはUnicodeですよ」っていう目印なんだ。Windowsでよく使われるんだけど、WebサーバーやLinuxだと「なんか変な文字が先頭についてる!」って文字化けの原因になることも多いよ。


BOMとは

BOM(Byte Order Mark:バイト順マーク) とは、テキストファイルの先頭に付加される特殊なバイト列のことです。主に Unicode でエンコードされたファイルが「どの文字コードを使っているか」「バイトの並び順(エンディアン)はどちらか」をプログラムやOSに伝えるために使われます。

もともとBOMはUTF-16やUTF-32のように、1文字を複数バイトで表す方式で「どちらの順番でバイトを読むか(ビッグエンディアン/リトルエンディアン)」を区別するために考案されました。しかし現在では UTF-8にもBOMが付くことがあり、これが「UTF-8 BOM付き」と「UTF-8 BOMなし」の違いとしてWebやシステム開発の現場でしばしば問題を引き起こします。

実務では、Windowsのメモ帳などで保存したファイルがBOM付きになっていて、PHPPythonのスクリプトや、CSVインポート機能でエラーや文字化けが起きる、というトラブルが頻発します。発注側として仕様書やデータ納品の際に「UTF-8 BOMなし」を明記する ことが重要です。


BOMの構造と種類

BOMはファイルの最先頭(バイト位置0)に埋め込まれる、人間には見えない特殊なバイト列です。

エンコーディングBOMのバイト列(16進数)用途
UTF-8(BOM付き)EF BB BFWindowsのメモ帳など
UTF-16 LEFF FEWindowsの標準Unicode
UTF-16 BEFE FFビッグエンディアン環境
UTF-32 LEFF FE 00 0032ビット文字(稀)
UTF-32 BE00 00 FE FF32ビット文字(稀)

Webの世界では UTF-8が事実上の標準 となっており、UTF-8ではバイト順の問題がそもそも存在しないため、BOMは「あってもなくてもよい」はずです。しかし実際には BOMありUTF-8がさまざまな不具合を引き起こす ため、Web開発では「UTF-8 BOMなし」が強く推奨されています。

BOMの見た目と「EF BB BF」の正体

UTF-8のBOM(EF BB BF)をテキストとして表示すると、多くの環境で 「」(通称:ゼロ幅ノーブレークスペース、またはBOM文字) として表れます。これがHTMLの先頭に混入すると、ブラウザが正しく解釈できず表示崩れが起きることがあります。

BOM有無の判別方法

【BOMなし UTF-8ファイルの先頭】
48 65 6C 6C 6F ...  → "Hello..."

【BOM付き UTF-8ファイルの先頭】
EF BB BF 48 65 6C 6C 6F ...  → (見えない3バイト)"Hello..."
                                               ↑ここがBOM

テキストエディタでは「ステータスバー」や「名前を付けて保存」のエンコーディング欄で「UTF-8」か「UTF-8 BOM付き」かを確認できます。VS Code では画面右下に UTF-8 と表示されている場合はBOMなし、UTF-8 with BOM と表示されている場合はBOM付きです。


歴史と背景

  • 1991年 — Unicodeコンソーシアムが文字コードの統一規格としてUnicodeを策定。複数バイトを使う文字表現が生まれ、バイト順(エンディアン)問題が浮上
  • 1996年 — Unicode 2.0でUTF-16が正式採用。BOMはこの時点でビッグエンディアン/リトルエンディアンを区別する手段として規定される
  • 1998年 — RFC 2279でUTF-8が広く公開(後にRFC 3629で改訂)。UTF-8はバイト順問題がなくBOMは不要とされたが、Windowsがエンコード識別のために付与し始める
  • 2000年代前半 — Windows XPのメモ帳が「Unicode(UTF-16)」「UTF-8」保存時に自動でBOMを付与。これがBOM付きファイルが広まる一因に
  • 2000年代後半 — Web開発がLinux/Mac中心になるにつれ、BOM付きファイルによるPHP・HTMLの文字化けトラブルが多発。「UTF-8 BOMなし」を明示する文化が定着
  • 2019年 — Windows 10のメモ帳がついに「UTF-8 BOMなし」をデフォルトで選択できるようになり、状況が改善

BOMあり・なしの影響比較

BOM付き UTF-8 vs BOMなし UTF-8 の影響比較 UTF-8 BOM付き(EF BB BF) ✅ Windowsのメモ帳で開いたとき 文字コード自動判別がしやすい ❌ PHPファイルに含まれると 「ヘッダー出力済み」エラーの原因に ❌ HTMLの先頭に入ると ブラウザの描画が崩れることがある ❌ CSVインポートで先頭セルに 「」が混入することがある ❌ シェルスクリプト(shebang行)に 含まれると実行エラーになる UTF-8 BOMなし(推奨) ✅ Web標準(HTML・CSS・JS) すべてのブラウザで安全に扱える ✅ PHPやPythonスクリプト 先頭バイト問題が起きない ✅ Linux/Macとの互換性が高い サーバー環境での動作が安定 ✅ CSVデータ納品・連携 文字化けなくインポートできる ✅ Git・バージョン管理 差分が余計なバイトで汚れない vs

発注・仕様書での書き方

システムやWebサイトを外注する際、ファイルの文字コード指定を仕様書に明記することでトラブルを防げます。

【仕様書記載例】
■ 文字コード
  すべてのテキストファイル(HTML/CSS/JS/PHP/CSV)は
  UTF-8(BOMなし)で納品すること。
  UTF-8 with BOM は不可。

特に CSVファイルの納品 では、Excelで開いて日本語が正しく表示されることを確認するためにBOM付きを希望するケースもあります。用途に応じて明示的に指定することが重要です。


関連する規格・RFC

規格・RFC番号内容
RFC 3629UTF-8の正式仕様。BOMは「使用してもよいが推奨しない」と規定
RFC 2119MUST/SHOULDなどRFCで使う要件レベルの定義(仕様書読解の基礎)

関連用語

  • 文字エンコーディング — 文字をバイト列に変換するルール全般
  • Unicode — 世界中の文字を統一的に扱う国際標準規格
  • UTF-8 — Unicodeの最も普及したエンコーディング方式
  • 文字化け — 文字コードの不一致によって文字が正しく表示されない現象
  • CSV — カンマ区切りのテキスト形式。BOMの有無がExcel連携に影響する
  • エンディアン — バイトの並び順(ビッグ・リトル)に関する概念
  • HTML文字コード宣言<meta charset="UTF-8"> でブラウザに文字コードを伝える仕組み