Предпочитаете объявление кодировки в метатеге HTML или заголовке HTTP? - PullRequest
6 голосов
/ 18 августа 2011

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

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

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

Ответы [ 2 ]

11 голосов
/ 18 августа 2011

Чтобы понять, что делают современные браузеры, вы должны начать читать с http://w3c.github.io/html/syntax.html#determining-the-character-encoding

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

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

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

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

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


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

3 голосов
/ 18 августа 2011

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

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

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

...