「エンコーディング」属性を理解するには、バイトと文字の違いを理解する必要があります。
バイトは0〜255の数値と考えてください。一方、文字は「a」、「1」、「Ä」のようなものです。使用可能なすべての文字のセットは、文字セットと呼ばれます。
各文字には、それを表すために使用される1バイト以上のシーケンスがあります。ただし、バイトの正確な数と値は、使用するエンコードによって異なり、さまざまなエンコードが存在します。
ほとんどのエンコーディングは、ASCIIと呼ばれる古い文字セットとエンコーディングに基づいています。ASCIIは、文字ごとに1バイト(実際は7ビットのみ)で、米国英語で使用される多くの一般的な文字を含む128文字を含みます。
たとえば、ASCII文字セットの6文字は、60〜65の値で表されます。
Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║ Character ║
╠══════╬══════════════║
║ 60 ║ < ║
║ 61 ║ = ║
║ 62 ║ > ║
║ 63 ║ ? ║
║ 64 ║ @ ║
║ 65 ║ A ║
╚══════╩══════════════╝
フルASCIIセットでは、使用される最小値はゼロであり、最大値は127です(これらは両方とも非表示の制御文字です)。
ただし、基本的なASCIIが提供するよりも多くの文字(たとえば、アクセント付きの文字、通貨記号、グラフィックシンボルなど)が必要になると、ASCIIは適さなくなり、より広範なものが必要になります。さらに多くの文字(別の文字セット)が必要であり、128文字ではすべての文字を収めるには不十分であるため、別のエンコーディングが必要です。一部のエンコーディングは、1バイト(256文字)または最大6バイトを提供します。
時間の経過とともに、多くのエンコーディングが作成されました。Windowsの世界にはCP1252、つまりISO-8859-1がありますが、LinuxユーザーはUTF-8を好む傾向があります。JavaはUTF-16をネイティブで使用します。
あるエンコーディングの文字のバイト値のシーケンスは、別のエンコーディングの完全に異なる文字を表す場合もあれば、無効な場合もあります。
たとえば、ISO 8859-1では、âは1バイトの値226
で表されますが、UTF-8では2バイトです195, 162
。しかし、中にISO 8859-1、195, 162
2つの文字、だろう、â。
XMLを一連の文字ではなく一連のバイトと考えてください。
XMLを受信するシステムがバイトを見ると想像してください195, 162
。これらの文字がどのようにしてわかるのですか?
システムがそれらのバイトを実際の文字として解釈する(そしてそれらを表示するか、別のエンコーディングに変換する)ためには、XMLで使用されているエンコーディングを知っている必要があります。
ほとんどの一般的なエンコーディングはASCIIと互換性があるため、基本的なアルファベット文字と記号に関する限り、これらの場合、宣言自体は、ASCII文字のみを使用してエンコーディングとは何かを回避できます。他の場合では、パーサーは宣言のエンコーディングを理解する必要があります。それは宣言が始まることを知っているので、<?xml
これを行うのはずっと簡単です。
最後に、version
属性はXMLバージョンを指定します。現時点では2つあります(WikipediaのXMLバージョンを参照してください。バージョン間にわずかな違いがあるため、XMLパーサーは何を処理しているかを知る必要があります。ほとんどの場合(英語の場合)とにかくスピーカー)、バージョン1.0で十分です。