UTF-8 BOM — バイトオーダーマーク(EF BB BF)

UTF-8バイトオーダーマーク(BOM)バイトEF BB BFとファイルに現れるタイミングを理解します。BOMがPHP、シェルスクリプト、JSON解析で問題を引き起こす理由を学びます。

Encoding

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が引き起こす問題:

  1. PHP<?phpタグの前のBOMが「headers already sent」エラーを引き起こす(3バイトのBOMがHTTPヘッダー設定前に出力されるため)
  2. シェルスクリプト#!/bin/bashの前のBOMがシバン行を認識不能にし、スクリプトの実行が失敗
  3. JSON — JSON仕様(RFC 8259)はJSONテキストがBOMで始まってはならないと規定(多くのパーサーは許容するが)
  4. CSVインポート — 一部のスプレッドシートプログラムはBOM付きCSVファイルを誤処理し、BOMを文字化けとして表示するか最初のフィールドを誤解釈
  5. ファイル結合 — 複数の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問題に遭遇します。

試してみる — Hex Editor

フルツールを開く