UTF-8 BOM — バイトオーダーマーク(EF BB BF)
UTF-8バイトオーダーマーク(BOM)バイトEF BB BFとファイルに現れるタイミングを理解します。BOMがPHP、シェルスクリプト、JSON解析で問題を引き起こす理由を学びます。
Hex
EF BB BF
ASCII
(invisible BOM)
詳細な説明
UTF-8バイトオーダーマーク(BOM)は、テキストファイルの先頭に現れる3バイトシーケンス — EF BB BF — で、ファイルがUTF-8でエンコードされていることを示します。善意に基づいていますが、UTF-8 BOMは頻繁にバグを引き起こし、現代の標準では一般的に不要とされています。
BOMとは何か?
BOMはUnicode文字U+FEFF(ゼロ幅ノーブレークスペース)です。UTF-8では、この文字は3バイトにエンコードされます: EF BB BF。元々UTF-16エンコーディング用に設計されており、バイトオーダーを示す重要な目的を果たします — ファイルがビッグエンディアン(FE FF)かリトルエンディアン(FF FE)かを示します。UTF-8ではバイトオーダーの曖昧性がないため(バイトは常に同じ順序)、BOMはエンコーディング識別子としてのみ機能します。
Unicodeエンコーディング全体のBOM:
| エンコーディング | BOM(Hex) | サイズ |
|---|---|---|
| UTF-8 | EF BB BF |
3バイト |
| UTF-16ビッグエンディアン | FE FF |
2バイト |
| UTF-16リトルエンディアン | FF FE |
2バイト |
| UTF-32ビッグエンディアン | 00 00 FE FF |
4バイト |
| UTF-32リトルエンディアン | FF FE 00 00 |
4バイト |
UTF-8 BOMが引き起こす問題:
- PHP —
<?phpタグの前のBOMが「headers already sent」エラーを引き起こす(3バイトのBOMがHTTPヘッダー設定前に出力されるため) - シェルスクリプト —
#!/bin/bashの前のBOMがシバン行を認識不能にし、スクリプトの実行が失敗 - JSON — JSON仕様(RFC 8259)はJSONテキストがBOMで始まってはならないと規定(多くのパーサーは許容するが)
- CSVインポート — 一部のスプレッドシートプログラムはBOM付きCSVファイルを誤処理し、BOMを文字化けとして表示するか最初のフィールドを誤解釈
- ファイル結合 — 複数のBOM付きファイルを結合すると、出力の途中にBOMが現れ、解析エラーの原因となる可能性
BOMが有用な場合:
Windowsでは、多くのプログラム(特にメモ帳や古いMicrosoftツール)がUTF-8エンコーディングの自動検出にBOMに依存しています。BOMがないと、ファイルをレガシーのWindows-1252エンコーディングとして誤解釈する可能性があります。
BOMの検出と削除:
hexエディタでは、BOMはオフセット0で即座に可視: EF BB BF。ファイルがこれらの3バイトで始まり、上記のいずれかの問題が発生している場合は、単純に削除します。多くの現代のエディタは「BOMなしUTF-8」で保存する明示的なオプションを提供しています。
ユースケース
開発者は、PHPの「headers already sent」エラーのデバッグ、シェルスクリプト実行障害の解決、Windowsアプリケーションで作成されたファイルのJSON解析問題のトラブルシューティング時にBOM問題に遭遇します。