XMLの符号化宣言は,各実体の内部ラベルとして機能し,どの文字符号化を使用するかを示す。しかし,XMLプロセサは,内部ラベルを読む前に,どの文字符号化を使用するかを知る必要があり,これが,内部ラベルが示そうとすることになる。一般的には,これは,絶望的な状態となる。しかし,XMLにおいては,完全には絶望的ではない。これは,XMLが,次の二つの点で一般的な場合に対する制限を加えることによる。一つの制限は,どの実装も有限個の文字符号化だけのサポートを想定することとする。他の一つの制限は,各実体で使用する文字符号化を自動検出可能とする,XMLの符号化宣言の位置及び内容に関する制限とする。多くの場合に,XMLのデータストリームに加え,他の情報が利用できる。ここでは,XMLの実体がプロセサに渡されるとき,(外部)情報を伴うかどうかによって,二つの場合に分ける。まず最初の場合を示す。
UTF-8形式又はUTF-16形式ではないXML実体は,最初の文字を‘<?xml
'とするXML符号化宣言で始まらなければならないので,どの適合したプロセサも,入力にある2オクテット又は4オクテットを調べれば,次のどの場合があてはまるかを検出できる。このリストを読む際には,UCS-4の'<'が"#x0000003C
",'?'が"#x0000003F
",及びUTF-16のデータストリームの必要とするバイト順マークが"#xFEFF
"ということを知っておくと役立つかもしれない。
00 00 00 3C
: UCS-4, big-endian マシン (1234順)
3C 00 00 00
: UCS-4, little-endian マシン (4321順)
00 00 3C 00
: UCS-4, 普通ではないオクテット順 (2143)
00 3C 00 00
: UCS-4, 普通ではないオクテット順 (3412)
FE FF
: UTF-16, big-endian
FF FE
: UTF-16, little-endian
00 3C 00 3F
: UTF-16, big-endian, バイト順マークなし(したがって,厳密にいえば,エラーとする。)。
3C 00 3F 00
: UTF-16, little-endian, バイト順マークなし(したがって,厳密にいえば,エラーとする。)。
3C 3F 78 6D
: UTF-8, ISO 646, ASCII, ISO 8859の各パート,Shift-JIS,EUC,並びに任意の他の7ビット,8ビット又は混在幅の符号化であって,ASCII文字を通常の位置,幅及び値とすることを保証するもの。これらのどれに対応するかを検出するためには,実際の符号化宣言を読み込まなければならない。しかし,これらすべての符号化は,ASCII文字に対して同じビットパターンを使用するので,符号化宣言自体は,正確に読込み可能とする。
4C 6F A7 94
: EBCDIC (又はその変種。どのコードページを使用するかを知るためには,符号化宣言全体を読み込まれなければならない。)
この程度の自動判別でも,XMLの符号化宣言を読み込み,文字符号化の識別子を解析するには十分とする。識別子の解析は,類似する各々の符号化の一つ一つを区別するために必要とする(例えば,UTF-8及び8859を区別するため,8859の各パートを区別するため,使用している特定のEBCDICコードページを区別するため,など。)。
符号化宣言の内容をASCII文字に限定しているので,どの分類の符号化を使用するかを検出すれば,プロセサは,符号化宣言全体を正確に読み込むことができる。現実問題として,広く使用されている文字符号化は,上の分類のいずれかにあてはまるので,オペレーティングシステム又は伝送プロトコルが与える外部情報を信頼不可能なときでさえも,内部ラベルで文字符号化をかなり正確に示すことが,XML符号化宣言によって可能となる。
プロセサが使用する文字符号化を検出しさえすれば,それぞれの場合に対して別個の入力ルーチンを呼び出す,又は入力する各文字に対し適切な変換関数を呼び出すことによって,適切な動作が可能となる。
自分自体にラベル付けをするいかなるシステムでも同様だが,ソフトウェアが,符号化宣言を更新せずに実体の文字集合又は符号化を変えたならば,XMLの符号化宣言は,機能しない。文字符号化ルーチンの実装者は,実体のラベル付けに使用する内部及び外部の情報の正確さの保証に注意するのが望ましい。
2番目の場合は,XMLの実体の他に,符号化情報が存在するときであって,いくつかのファイルシステム及びネットワークプロトコルでは,その符号化情報が存在する。複数の情報が利用できるとき,それらの相対的な優先度及びそれらが矛盾したときの望ましい処理方法は,XMLの配送に使用する,より高水準のプロトコルの一部として規程するのがよい。例えば,内部ラベル及び外部ヘッダに存在するMIME形式のラベルの相対的な優先度に対する規則は,text/xml及びapplication/xmlのMIME型を定義するRFC文書の一部となる方がよい。しかし,相互運用性のために,次の規則に従うことが望ましい。