BOM(ボム)とは | 意味や読み方など丁寧でわかりやすい用語解説
BOM(ボム)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
部品表 (ブヒンヒョウ)
英語表記
BOM (ボム)
用語解説
BOMとはByte Order Markの略であり、主にUnicodeテキストファイルにおいて、そのエンコーディングの種類とバイトオーダーを示すためにファイル先頭に付与される特定のバイト列のことである。Unicodeには複数のエンコーディング方式があり、代表的なものにUTF-8、UTF-16、UTF-32などがある。これらのうち、UTF-16やUTF-32は、データを構成するバイトの並び順、すなわちエンディアンの違いによって同じ文字コードでも異なる表現を取り得る。このエンディアンには、最上位バイトから順に並べるビッグエンディアンと、最下位バイトから順に並べるリトルエンディアンの二種類が存在する。BOMは、このエンディアンの違いを明示し、テキストファイルを読み込むプログラムが正しく内容を解釈できるようにするための目印として機能する。
例えば、UTF-16で記述されたテキストファイルを異なるプラットフォーム間でやり取りする際、送信側と受信側でエンディアンの解釈が異なると、文字化けやデータ破損の原因となる。BOMはこのような問題を回避するために導入された。ファイルの先頭に、特定のユニコード文字であるU+FEFF(ゼロ幅ノーブレークスペース)のバイト表現を配置することで、このファイルがどのエンコーディング方式で、どのバイトオーダーで記述されているかを明確に伝える。
しかし、全てのUnicodeエンコーディングでBOMが必須というわけではない。特にUTF-8においては、バイトオーダーの概念が元々存在しないため、BOMは必須ではないどころか、かえって問題を引き起こす場合がある。これは後述する詳細で触れる。BOMは、テキストファイルがどのようなルールで書かれているかという「自己記述性」を高めるための仕組みの一つと理解すると良い。
BOMは、U+FEFFというユニコード文字のバイト表現がファイルの先頭に付加されることで機能する。このU+FEFFは、元々はゼロ幅ノーブレークスペースという意味を持つが、ファイル先頭に置かれる場合はBOMとしての特別な意味を持つ。
UTF-16におけるBOMは、エンディアンの識別に決定的な役割を果たす。UTF-16では各文字が2バイトで表現されるため、この2バイトの並び順が問題となる。例えば、U+FEFFの文字コードは、ビッグエンディアンではFE FFというバイト列で、リトルエンディアンではFF FEというバイト列で表現される。したがって、ファイルの先頭にFE FFがあればそのファイルはUTF-16ビッグエンディアン、FF FEがあればUTF-16リトルエンディアンであると判断できる。同様に、UTF-32では各文字が4バイトで表現されるため、U+FEFFのバイト列は、ビッグエンディアンでは00 00 FE FF、リトルエンディアンではFF FE 00 00となり、これによってエンディアンを識別する。
一方、UTF-8においてはBOMの扱いは複雑である。UTF-8は可変長エンコーディングであり、各文字が1バイトから4バイトで表現される。UTF-8はバイトオーダーの概念が元々なく、バイト列の解釈にエンディアンの考慮は不要であるため、技術的にはBOMを付与する必要はない。しかし、UTF-8であることを明示するため、あるいは過去のシステムやWindows環境との互換性を確保するために、あえてBOMを付与するケースがある。UTF-8におけるBOMのバイト列はEF BB BFである。
このUTF-8のBOMは、しばしば問題の原因となる。特に、Web開発においてPHP、Python、Rubyなどのスクリプト言語で書かれたファイルや、XML、JSONなどの設定ファイルで問題が発生しやすい。これらの言語やフォーマットでは、ファイルの先頭に厳密な構文が要求される場合が多く、EF BB BFという3バイトのBOMが予期せぬ文字として解釈され、構文エラーや実行時エラーを引き起こすことがある。例えば、PHPファイルでBOMが付与されていると、HTTPヘッダーの出力よりも先にBOMが出力されてしまい、「Cannot modify header information - headers already sent」といったエラーが発生することがある。これは、BOMがウェブブラウザに送信されるコンテンツの一部として扱われ、ヘッダー送信後にコンテンツが続くというHTTPの規則に違反するためである。
また、設定ファイルにおいても、BOMが存在することでファイルの内容が正しくパースされず、アプリケーションが期待通りに動作しないといった問題も発生しうる。多くのモダンなテキストエディタや統合開発環境(IDE)では、UTF-8ファイルを保存する際にBOMを付与するかしないかを選択できる設定項目が用意されている。一般的には、UTF-8ファイルにおいてはBOMなし(UTF-8NまたはUTF-8 without BOM)で保存することが推奨されている。これにより、互換性の問題や予期せぬエラーの発生を回避できる。
BOMの有無を確認するには、ファイルのバイナリ情報を直接調べる方法が有効である。例えばLinux系のシステムでは、hexdumpコマンドなどを使ってファイルの先頭バイト列を確認することで、BOMが存在するかどうかを判別できる。
結論として、BOMはUTF-16やUTF-32のようなエンディアンに依存するエンコーディングでは、バイトオーダーを明確にする重要な役割を果たす。しかし、UTF-8においては技術的な必要性がなく、むしろ多くの場面で互換性の問題やエラーの原因となるため、BOMなしでの利用が現在の主流であり、推奨されるアプローチとなっている。システムエンジニアとしては、開発するシステムや利用するフレームワーク、ライブラリがBOMの有無に対してどのように振る舞うかを理解し、適切なエンコーディングとBOMの有無を選択する知識が求められる。特にWeb系の開発や、複数のシステム間でテキストファイルをやり取りする際には、BOMの有無が重要な考慮事項となるため、常に意識しておく必要がある。