Як сказати браузеру кодування символів веб-сайту HTML незалежно від заголовка типу вмісту сервера?


9

У мене є HTML-сторінка, яка правильно (кодування фізичного на диску відповідає їй) оголошує, що це Content-Type :

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta http-equiv="Content-Type" content=
    "text/html; charset=utf-8">
    <title> ...

Відкриття файлу з диска в браузері (Google Chrome, Firefox) працює чудово.

Запросивши його через HTTP, веб-сервер надсилає інший заголовок типу вмісту:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 10:57:13 GMT
...
Content-Type: text/html; charset=ISO-8859-1

(див. останній рядок). Потім браузер використовує ISO-8859-1 для відображення небажаного результату.

Чи є загальний спосіб змінити заголовки сервера, що надсилаються до браузера, з документа HTML?

Відповіді:


6

"Чи існує загальний спосіб перекриття заголовків серверів, що надсилаються до браузера, з документа HTML?"

AFAIK ні, ви робите те, що вже можете зробити. Визначений набір за допомогою заголовка перетворює ваше визначення в тезі META.

Якщо у вас є доступ до сервера, наприклад Apache, він конфігурується цим твердженням (див. Рядки коментарів):

# Read the documentation before enabling AddDefaultCharset.
# In general, it is only a good idea if you know that all your files
# have this encoding. It will override any encoding given in the files
# in meta http-equiv or xml encoding tags.

#AddDefaultCharset UTF-8

[Оновлення]

До другого коментаря w3d ви знайдете кілька способів зміни діаграми через htaccess-директиви для сервера Apache.


2
+1 заголовки HTTP заміняють HTML-теги HTML. Якщо @hakre має доступ до сервера, вони також можуть змінювати заголовок Content-Type на сторінці.
MrWhite

3
Ось, ось нормативна посилання, яка вказує, що заголовки HTTP козирують метатегами
Jukka K. Korpela

Дякую за відповідь. @Korpela: Так, у мене це було на пам’яті з специфікаціями HTML. Це точно навпаки, як мені це потрібно :(.
хакре

Щодо .htaccess (вибачте, це може бути замість цього нове запитання), чи можливо також видалити ;charset=...з заголовка http. На сайті дуже добре працює Content-Type: text/html, різні файли мають різні кодування на сервері. (Я боюся, що це теж неможливо, тому що я думаю, що я шукав це кілька тижнів тому, але результат був не зовсім остаточним). На всякий випадок, якщо ви можете пролити трохи світла вперед.
хакре

@hakre Якщо директива ForceType Apache працює для вас, помістіть її у <Files> Container та окремо іменуйте файли чи певні каталоги. Просто залиште частину "; charset =" після типу mime, тоді це слід зробити.
initall

3

Ви повинні встановити щось подібне у своєму корені .htaccess

<FilesMatch "\.(htm|html|xhtml|xml|php)$">
    AddDefaultCharset utf-8
</FilesMatch>

3

Ні, це неможливо всередині HTML. Заголовок відповіді серверів має перевагу над метатегом документа. Як зазначено в 5.2.2 Вказання кодування символів - HTML 4.01 Специфікація :

Підводячи підсумок, відповідні агенти користувача повинні дотримуватися наступних пріоритетів при визначенні кодування символів документа (від найвищого пріоритету до найнижчого):

  1. Параметр "charset" HTTP у полі "Тип вмісту".
  2. Декларація META з "http-equiv" встановлена ​​на "Content-Type" та значенням для "charset".
  3. Атрибут charset встановлений на елементі, що позначає зовнішній ресурс.

Отже, для цього потрібна конфігурація на стороні сервера. Однак, як глава продовжує:

Користувацькі агенти можуть надати механізм, який дозволяє користувачам переосмислювати невірні відомості про "схему". Однак якщо користувальницький агент пропонує такий механізм, він повинен пропонувати його лише для перегляду, а не для редагування, щоб уникнути створення веб-сторінок, позначених неправильним параметром "charset".

У моєму випадку заголовок Content-Type сервера містить правильний тип mime, але неправильний діаграм .

Як виявилось, моя конфігурація Apache httpd встановила AddDefaultCharsetввімкнений, який додавав ; charset=ISO-8859-1частину. Розміщення в кореневому каталозі веб-сайтів .htaccessнаступного рядка:

AddDefaultCharset Off

інформація про шаблони була видалена:

$ curl -I http://example.com/file.html
HTTP/1.1 200 OK
Date: Fri, 19 Oct 2012 15:07:52 GMT
...
Content-Type: text/html

(див. останній рядок, жодної ; charset=...частини). Це в поєднанні з мета-тегом html ініціює згадану евристику браузера взяти на себе діаграму з метатега. Веб-сайт правильно розшифрований.

Тестували:

  • Google Chrome проти 22.0.1229.94
  • Firefox v. 16.0.1
  • Версія Lynx 2.8.7rel.1 (05 липня 2009 р.)

Ці три браузери мали проблеми з оригінальною конфігурацією та працюють зараз (усі на Fedora 17).

  • Опера 12.02
  • Internet Explorer 6 (Win XP SP3)

Не було в першу чергу проблеми. Обидва віддали перевагу UTF-8 від метатега над параметром ISO-8859-1 від сервера.

  • Netscape 2.01 Золото

Не підтримує UTF-8, тому завжди вибирає Western (Latin1) незалежно від налаштування сервера та метатегів.


1

На додаток до сказаного тут, я б спробував використовувати однакову схему на всіх сторінках - бажано UTF-8(але якщо майже все є iso-8859-1, використовуйте це).

Щоб швидко перевірити набір файлів, ви можете спробувати:

file --mime-type --mime-encoding {filename}

Щоб перевірити набір усіх файлів у дереві, ви можете спробувати:

find . -type f -exec file --mime-type --mime-encoding '{}' \;

або (викликаючи fileкоманду лише один раз):

find . -type f -print | file --mime-type --mime-encoding -f-

Щоб отримати підсумок, скористайтесь -bпараметром fileкоманди (щоб опустити імена файлів) і передайте результат sort | uniq -c.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.