BOM
読み:ビーオウエム
外語:BOM: Byte Order Mark
Unicode
の符号化のうち、
UTF-16
、
UTF-32
などで採用されている
エンディアンネス
識別符号。
Unicode 3.0
ではChapter13に書かれている。
目次
概要
特徴
ZWNBSP
使用は任意
仕様
UTF-8
概要
Unicodeは「16ビット固定長」から始まった。同時期に
ISO/IEC 10646
は「31ビット固定長」から始まった。
しかし多くのコンピューターは8ビット程度をバイトという単位として扱い、更にエンディアンネスも様々なものが混在した。符号のエンディアンネスを識別可能にするためには、二つの解決法がある。
符号のエンディアンネスを固定化する
符号のエンディアンネスは自由にして、代わりに目印を付ける
前者を採用するのが最も
スマート
であるが、初期のUnicodeの符号化では後者が採用された。符号のエンディアンネスを先頭の文字で区別することから、これをバイトオーダーマーク(バイト順序マーク、BOM)という。
特徴
ZWNBSP
UnicodeおよびISO/IEC 10646では、U+FEFFとして「ZERO WIDTH NO-BREAK SPACE」(幅の無い改行しない空白、略してZWNBSP)という記号を定義している。これとバイト順が逆になるU+FFFEは同様に
非文字
とされ、未来永劫使用されない符号位置と定義された。
ZWNBSPは、見えないし改行もされないし文字幅もゼロの、存在自体を無視できる文字である。
かくして、ファイルまたはストリームの先頭のU+FEFFの順序を確認することで、符号化の種類やエンディアンネスを判別することができる。
使用は任意
BOMを付けるかどうかは任意であり、付けない場合もある。無い場合、エンディアンネスについては処理系依存ということになる。
但し、現在使われている「UTF-16」という符号化方法では明確に規定があり、BOMが無い場合はビッグエンディアン(
UTF-16BE
相当)として扱うことになっている。
なお、Microsoft Windowsで「Unicode」と俗称されている符号はUTF-16であり、通常はBOM付きリトルエンディアンで符号を入出力している。
仕様
各符号ごとに、次のような順序になる。
UTF-16
ビッグエンディアン
: 0xFE 0xFF
リトルエンディアン
: 0xFF 0xFE
UTF-32
ビッグエンディアン: 0x00 0x00 0xFE 0xFF
リトルエンディアン: 0xFF 0xFE 0x00 0x00
UTF-8
UTF-8は、バイト順が明確に固定されている。従って、バイト順序マーク(BOM)といったものは必要とされない。
UTF-8では、U+FEFFは「0xEF 0xBB 0xBF」と3オクテットで符号化され、UTF-8の
文書ファイル
等では、それがUTF-8であることを示すために先頭に附されることが多い。但しバイト順をこれで決めているわけではないので、これをBOMと呼ぶことは現実には不正確である。
再検索