Chapter 02

Byte Order Mark とは

zetamatta
zetamatta
2021.02.07に更新

いわゆる BOM ですが

Byte Order Mark という名前の通り、本来は16ビット表記されたUTF16 のコードを使う時に1バイト目が上位8ビットなのか下位8ビットなのかを判別させるためのマークです。コードとしては U+FEFF というコードです。これがプログラム側の想定と逆の場合 U+FFFE と見えてしまうので、もしそうだったら、バイトの順番を逆転して読み替えてくださいという指示を示すコードです。

UTF8 の時は UTF16 と違って、どういう順番にコードを並べるかが規格でガチガチで決まっているので、本来 Byte Order Mark は不要です。が、強いて Byte Order Mark を UTF8 で表現することも可能で EF BB BF というコードになります。

なぜ Byte Order Mark は嫌われたのか

結局のところ「存在しているのに、ユーザは関知できないし、普通に編集操作で除くことも難しい」というのがすべての元凶でしょう。自分も Byte Order Mark がついているかどうか、自作のバイナリファイルビューアで確認しました。

よくある症状としては「Windows でスクリプトを作成したのに、Linux に転送すると動かない」というパターンです。これはいわゆる shebang 行の #! の前に ByteOrderMark が入ってしまって4バイト目・5バイト目にずれてしまい、Linux のプログラムローダーが #! を認識しなくなるために起きます。

とはいえ、そもそも「Linux で動かすスクリプトを Windows のメモ帳で編集するのってどうよ」という話ではあります。

また、XML については、宣言部で UTF8 を指定するので BOM は不要、JSON などは明確に使ってはならないとされているようです