Какая польза от "кодирования" в заголовке XML?

Глядя на заголовок XML

<?xml version="1.0" encoding="UTF-16" standalone="no"?>

Можно ли утверждать, что атрибут encoding

  • слишком поздно (вы не можете прочитать его правильно, если не знаете кодировку...)
  • избыточно, следовательно, подвержено ошибкам: слишком легко заменить его на "Big5", но сохранить файл в UTF-8

Или это атрибут не о содержимом потока?

Я тут что-то перемешиваю?

Ответ 1

Как вы уже упоминали, вам нужно знать кодировку файла для чтения атрибута encoding.

Однако существует эвристика, которая может легко приблизить вас к "реальной" кодировке, чтобы вы могли прочитать атрибут кодирования. Это работает, потому что часть <?xml по определению может содержать только символы в диапазоне ASCII (однако они закодированы).

Стандарт XML даже описывает точный процесс, используемый для определения кодировки.

И ярлык кодировки также не является избыточным. Например, если вы используете алгоритм в спецификации XML, чтобы узнать, что используется некоторая ASCII-кодировка (или ASCII-совместимая), вам все равно нужно прочитать кодировку, чтобы узнать, какой из них действительно используется (действительными кандидатами будут ASCII, UTF-8, любой из ISO-8859- * encoding, любой из Windows- * encodings, KOI8-R и многие, многие другие). Для самой части <?xml она не изменит того, какой она есть, но для остальной части документа она может иметь огромное значение.

Относительно ошибочно помеченных XML файлов: да, легко создать те, однако: спецификация XML четко указывает, что эти файлы некорректны и, как таковые, не соответствуют правилу XML. Неправильные кодировки должны сообщаться как ошибка (при условии, что они могут быть обнаружены!). Итак, это проблема того, кто производит XML.

Ответ 2

Вы совершенно правы, что это выглядит странным дизайном. Он работает только потому, что в декларации XML используются только символы ASCII, и почти все кодировки являются надмножествами ASCII. Если вы готовы принять что-то, что нет, например, EBCDIC, вы можете проверить, начинается ли файл с любым представлением EBCDIC "<?xml". Это означает, что вы полагаетесь на общий уровень избыточности в заголовке файла, а не на сам атрибут кодирования. Как и многие вещи в XML, это прагматично и работает, но не особенно элегантно.

Ответ 3

Анализаторы XML необходимы только для поддержки UTF-8 и UTF-16. Парсер XML начинается с проверки кодировок на основе байтового байта (BOM), если он присутствует (для UTF-16, UTF-32 и даже UTF-8 с фиктивной спецификацией). Если ни один не найден, то синтаксический анализатор будет использовать UTF-32, UTF-16, UTF-8, ASCII и другие однобайтовые кодировки, совместимые с ASCII. Только тогда он увидит атрибут кодирования и при необходимости перезапустит парсинг.

Ответ 4

Я думаю, что в принципе у вас может быть точка, что оператор encoding "задерживается" в файле, однако вся первая строка использует только базовые символы. AFAIK, те же самые почти во всех кодировках, так что независимо от того, что вы его декодируете, он все равно будет читать <?xml ... ?>.

Все, что приходит после этого, может иметь значение. Например, текст в разделе CDATA может быть закодирован в кириллической кодировке.