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付きになっていて、PHPやPythonのスクリプトや、CSVインポート機能でエラーや文字化けが起きる、というトラブルが頻発します。発注側として仕様書やデータ納品の際に「UTF-8 BOMなし」を明記する ことが重要です。
BOMの構造と種類
BOMはファイルの最先頭(バイト位置0)に埋め込まれる、人間には見えない特殊なバイト列です。
| エンコーディング | BOMのバイト列(16進数) | 用途 |
|---|---|---|
| UTF-8(BOM付き) | EF BB BF | Windowsのメモ帳など |
| UTF-16 LE | FF FE | Windowsの標準Unicode |
| UTF-16 BE | FE FF | ビッグエンディアン環境 |
| UTF-32 LE | FF FE 00 00 | 32ビット文字(稀) |
| UTF-32 BE | 00 00 FE FF | 32ビット文字(稀) |
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あり・なしの影響比較
発注・仕様書での書き方
システムやWebサイトを外注する際、ファイルの文字コード指定を仕様書に明記することでトラブルを防げます。
【仕様書記載例】
■ 文字コード
すべてのテキストファイル(HTML/CSS/JS/PHP/CSV)は
UTF-8(BOMなし)で納品すること。
UTF-8 with BOM は不可。
特に CSVファイルの納品 では、Excelで開いて日本語が正しく表示されることを確認するためにBOM付きを希望するケースもあります。用途に応じて明示的に指定することが重要です。
関連する規格・RFC
| 規格・RFC番号 | 内容 |
|---|---|
| RFC 3629 | UTF-8の正式仕様。BOMは「使用してもよいが推奨しない」と規定 |
| RFC 2119 | MUST/SHOULDなどRFCで使う要件レベルの定義(仕様書読解の基礎) |
関連用語
- 文字エンコーディング — 文字をバイト列に変換するルール全般
- Unicode — 世界中の文字を統一的に扱う国際標準規格
- UTF-8 — Unicodeの最も普及したエンコーディング方式
- 文字化け — 文字コードの不一致によって文字が正しく表示されない現象
- CSV — カンマ区切りのテキスト形式。BOMの有無がExcel連携に影響する
- エンディアン — バイトの並び順(ビッグ・リトル)に関する概念
- HTML文字コード宣言 —
<meta charset="UTF-8">でブラウザに文字コードを伝える仕組み