Какая польза от «кодировки» в заголовке XML? - PullRequest
41 голосов
/ 02 марта 2011

Просмотр заголовка XML

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

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

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

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

Я здесь что-то путаю?

Ответы [ 4 ]

41 голосов
/ 02 марта 2011

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

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

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

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

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

6 голосов
/ 02 марта 2011

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

2 голосов
/ 02 марта 2011

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

0 голосов
/ 02 марта 2011

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

Что бы ни последовало после , однако может иметь значение.Например, текст в разделе CDATA может быть закодирован в кодировке кириллицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...