UTF-8とXMLとBOM

UTF-8で書かれたXMLファイルの先頭にBOMがあっても良いのか、という話。

BOM(Byte Order Mark)とは

Unicode標準において、UTF-16UTF-32を用いて符号化されたテキストのバイト順が、ビッグエンディアンかリトルエンディアンかを判別するために使われるマークのこと。
文字U+FEFF(ZERO WIDTH NO-BREAK SPACE)がこのマークとして用いられる。

規格を追うと

XML規格BNFを辿っていくと、BOMを表す文字であるU+FEFFは先頭には来れないないことになっている。XML宣言の前にほかの文字が入っちゃいけないし、XML宣言が省略されたとしても、先頭に来れるのは空白類とコメントと処理命令くらい。

ただし、4.3.3 Character Encoding in Entitiesを見ると、次のように書いてある。

(略)... entities encoded in UTF-8 MAY begin with the Byte Order Mark ... (略) ... This is an encoding signature, not part of either the markup or the character data of the XML document.

つまり、UTF-8で符号化されたエンティティはBOMで始まっていても良くて、その場合BOMはXMLの中身をなす文字ではなく、エンコーディング判別に利用される符号(上位プロトコルと言ってもいいかな)である、と。なので、このBOMはBNFで規定される文法の対象外として扱われるということのよう。

「エンティティは…」とありますが、XML文書全体もdocument entityという一種のエンティティなので、この仕組みが適用されるとみなしてよいでしょう。

結論

UTF-8エンコードされたXML文書の先頭にBOMがあっても問題ない(はず)。

アプリケーションの対応は

BOMを受け付けないものもあるそうな(未調査)。