Ответ 1
Чтобы понять атрибут "encoding", вы должны понимать разницу между байтами и символами.
Подумайте о байтах как числа от 0 до 255, тогда как символы - это такие, как "a", "1" и "Ä". Набор всех доступных символов называется набором символов.
Каждый символ имеет последовательность из одного или нескольких байтов, которые используются для его представления; однако точное количество и значение байтов зависит от используемой кодировки и существует множество разных кодировок.
Большинство кодировок основаны на старом наборе символов и кодировке под названием ASCII, который представляет собой один байт на символ (фактически, всего 7 бит) и содержит 128 символов, включая множество общих символов, используемых на английском языке.
Например, здесь 6 символов в наборе символов ASCII, которые представлены значениями от 60 до 65.
Extract of ASCII Table 60-65
╔══════╦══════════════╗
║ Byte ║ Character ║
╠══════╬══════════════║
║ 60 ║ < ║
║ 61 ║ = ║
║ 62 ║ > ║
║ 63 ║ @ ║
║ 64 ║ A ║
║ 65 ║ B ║
╚══════╩══════════════╝
В полном наборе ASCII самое низкое значение - ноль, а самое высокое - 127 (оба являются скрытыми управляющими символами).
Однако, как только вы начнете нуждаться в большем количестве символов, чем базовый ASCII (например, буквы с акцентами, символы валюты, графические символы и т.д.), ASCII не подходит, и вам нужно что-то более обширное. Вам нужно больше символов (другой набор символов), и вам понадобится другая кодировка, так как для символов всех символов не хватает 128 символов. Некоторые кодировки предлагают один байт (256 символов) или до шести байтов.
С течением времени было создано множество кодировок. В мире Windows есть CP1252 или ISO-8859-1, тогда как пользователи Linux предпочитают UTF-8. Java использует UTF-16 изначально.
Одна последовательность байтовых значений для символа в одной кодировке может означать совершенно другой символ в другой кодировке или даже может быть недействительной.
Например, в ISO 8859-1 â представлен одним байтом значения 226
, тогда как в UTF-8 это два байта: 195, 162
. Однако в ISO 8859-1 195, 162
должно быть два символа, Ã, ¢.
Подумайте о XML как о не последовательности символов, а о последовательности байтов.
Представьте, что система, получающая XML, видит байты 195, 162
. Как он знает, что это за персонажи?
Чтобы система интерпретировала эти байты как действительные символы (и поэтому отображала их или конвертировала их в другую кодировку), она должна знать кодировку, используемую в XML.
Поскольку большинство распространенных кодировок совместимы с ASCII, в том, что касается основных буквенных символов и символов, в этих случаях сама декларация может уйти с использованием только символов ASCII, чтобы сказать, что такое кодировка. В других случаях анализатор должен попытаться определить кодировку декларации. Поскольку он знает, что объявление начинается с <?xml
, это намного проще сделать.
Наконец, атрибут version
указывает версию XML, в которой на данный момент есть две (см. версии Wikipedia XML. Существуют небольшие различия между версиями, поэтому парсер XML должен знать, с чем он имеет дело. В большинстве случаев (для говорящих на английском языке) версия 1.0 достаточна.