コンテンツにスキップ

バイト順マーク

出典: フリー百科事典『ウィキペディア(Wikipedia)』

これはこのページの過去の版です。Luckas-bot (会話 | 投稿記録) による 2011年11月27日 (日) 22:27個人設定で未設定ならUTC)時点の版 (r2.7.1) (ロボットによる 追加: sv:Byte order mark)であり、現在の版とは大きく異なる場合があります。

バイトオーダーマーク (byte order mark) あるいはバイト順マーク(バイトじゅんマーク)は通称BOM(ボム)といわれる、Unicode符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。

概要

Unicodeで表現されるデータが、それがUnicodeで表現されていることをプログラムが判断する方法として、データの先頭を読み、その先頭のバイト値からそのデータがUnicodeであることの判別とどのUnicodeの符号化形式を使用するかを判別する手がかりとして使用される。

UnicodeがはじまったころはアメリカではASCII、ヨーロッパなどではISO-8859、日本ではShift_JISEUC-JPが主流であり、Unicodeの求める世界共通の符号化とするためには、使用されている符号化方式がUnicodeであることを明確に区別する必要があった。その方法として、先頭のデータにテキスト以外のデータを入れることが発案された。

また、エンディアンが複数あり、OSにおけるメモリやレジスタなどの扱い方から、当時はDOSUNIXではリトルエンディアン、Macintoshではビッグエンディアンでの符号化が主であり、これが区別できないと正常にデータの交換ができない状態があったため、この先頭バイトにより区別していた。

UTF-8は既存のASCIIなどのデータしか読み込みが行えない場合でも正常に扱えるようにするための符号化であるが、このデータがついていることによりASCIIしか読み込めないプログラムではデータが正常に処理できなくなる問題が発生する場合がある。

RFC3023の「XML Media Types」ではXMLをUTF-16で符号化する場合は先頭にBOMをつけることを必須としており、XMLの解析プログラムにおいては、先頭にBOMがあった場合<?xmlの後のencodingよりも優先して符号化を判別することを求めている。[1]ただし、UTF-16LEやUTF-16BEでは逆にBOMを付けてはならず、UTF-8においてもBOMは不要としている。

データをメモリ上に格納する場合、その都度バイトオーダーマークをつけるとデータ量が肥大化し、データの効率およびプログラムの性能に障害が出てくることがあるため、内部のデータ形式では省略することがある。

ISO/IEC 8859-1では0xFEは「þ」、0xFFは「ÿ」が割り当てられており、この2文字が先頭に来る文章の場合あやまってUnicodeと判断されてしまうことがある。

各符号化形式(符号化スキーム)ごとのバイトオーダーマーク

符号化形式(符号化スキーム) バイトオーダーマーク
UTF-8 0xEF 0xBB 0xBF
UTF-8N 付加しない
UTF-16(BE) 0xFE 0xFF
UTF-16(LE) 0xFF 0xFE
UTF-16BE 付加しない
UTF-16LE 付加しない
UTF-32(BE) 0x00 0x00 0xFE 0xFF
UTF-32(LE) 0xFF 0xFE 0x00 0x00
UTF-32BE 付加しない
UTF-32LE 付加しない
UTF-7 0x2B 0x2F 0x76 ※ (※は次のバイトの値によって異なり、0x38、0x39、0x2B、0x2Fのいずれかがくる)

脚注

  1. ^ XML Media Types (RFC3023の公式文書)