バイト順マーク
Unicode |
---|
文字符号化スキーム |
UTF-7 |
UTF-8 |
CESU-8 |
UTF-16 |
UTF-32 |
UTF-EBCDIC |
SCSU |
Punycode (IDN/IDNA) |
GB 18030 |
その他 |
UCS |
マッピング |
書字方向 |
BOM |
漢字統合 |
UnicodeとHTML |
Unicodeと電子メール |
Unicodeフォント |
バイトオーダーマーク (byte order mark) あるいはバイト順マーク(バイトじゅんマーク)は通称BOM(ボム)といわれる、Unicodeの符号化形式で符号化したテキストの先頭につける数バイトのデータのことである。このデータを元にUnicodeで符号化されていることおよび符号化の種類の判別に使用する。
概要
Unicodeで表現されるデータが、それがUnicodeで表現されていることをプログラムが判断する方法として、データの先頭を読み、その先頭のバイト値からそのデータがUnicodeであることの判別とどのUnicodeの符号化形式を使用するかを判別する手がかりとして使用される。
UnicodeがはじまったころはアメリカではASCII、ヨーロッパなどではISO-8859、日本ではShift_JISやEUC-JPが主流であり、Unicodeの求める世界共通の符号化とするためには、使用されている符号化方式がUnicodeであることを明確に区別する必要があった。その方法として、先頭のデータにテキスト以外のデータを入れることが発案された。
また、エンディアンが複数あり、OSにおけるメモリやレジスタなどの扱い方から、当時はDOSやUNIXではリトルエンディアン、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のいずれかがくる) |
脚注
- ^ XML Media Types (RFC3023の公式文書)