Предпочитаете объявление кодировки в метатеге HTML или заголовке HTTP?

Я разбираю много сайтов. Все отлично работает, я также читаю объявления кодировок для преобразования кодировок. Теперь у меня проблема с http://celleheute.de/sonntagsfuhrung-3/.

В метатеге HTML написано, что контент закодирован как ISO-8859-2, а в заголовке HTTP написано, что это UTF-8. И действительно, контент имеет кодировку UTF, поэтому, когда мой анализатор попытается преобразовать контент в ISO, он сломает некоторые символы.

Теперь мой вопрос: какую декларацию я предпочитаю? Должен ли я игнорировать метатеги, когда я могу найти объявление в заголовке HTTP или наоборот? Что будет делать большинство веб-браузеров?

2 ответа

Решение

Чтобы понять, что делают современные браузеры, вы должны начать читать с http://dev.w3.org/html5/spec/parsing.html

Шаги один и два наиболее актуальны для вопроса. Они говорят

  1. Если пользователь явно дал указание агенту пользователя переопределить кодировку символов документа определенной кодировкой, при необходимости верните эту кодировку с определенной уверенностью и отмените эти шаги.

  2. Если транспортный уровень задает кодировку и поддерживается, верните эту кодировку с уверенностью и отмените эти шаги.

Это означает, что настоящий HTTP-заголовок имеет приоритет над всем, кроме перегрузки пользователя.

Помимо этого это может стать сложным. Метка порядка байтов, например, может иметь приоритет над метатегом.


ОБНОВЛЕНИЕ: Поскольку этот ответ был написан, спецификация изменилась (примерно в середине 2012 года), так что метка порядка байтов теперь имеет приоритет над заголовком HTTP.

Там просто нет ответа на это. Автор страницы допустил ошибку, предоставив противоречивую информацию. Какой из них правильный, может быть решено броском монеты.

В целом, я бы предпочел HTTP-заголовок в качестве основного значения. В любом случае метатег подразумевается как запасной вариант. Если вы хотите следовать какой-либо логике, сначала попытайтесь декодировать документ, используя набор символов, указанный в заголовке HTTP. Если это явно не удается, поскольку определенные байты недопустимы в данной кодировке, попробуйте еще раз в кодировке, указанной в метатеге, если таковые имеются. Если это не помогло, все ставки сняты.

Если ни одна из них не дает сбоя, но кодировка конфликтует, либо задействуйте человека, либо попробуйте некоторый статический анализ декодированного текста, который может сказать вам, что с большей вероятностью будет правильным.

Другие вопросы по тегам