Как правильно подготовить свою WWW страничку

Этот раздел появился благодаря (фактически полностью состоит из) статьям Андрея А. Чернова. Подробную информацию по этому вопросу можно найти на страничке А.А. Чернова KOI8-R - Russian Net Character Set.

Предисловие

Всемирное падение нравов началось с незначительной уступки пользователям. Как известно, в стандартах по HTML/HTTP чётко сказано, что каждому документу должен соответствовать такой параметр, как MIME-имя кодировки, и есть только один случай, когда его можно не указывать — если документ составлен в кодировке ISO 8859-1. Это правило оказалось либо совершенно неизвестным, либо невыносимо сложным для неподготовленных пользователей, так что они предпочли проигнорировать его, и странички создавались просто набиванием некоторых кодов.

Далее, компании Netscape начал поступать поток претензий, что странички, набитые таким образом, не видны. Вместо того, чтобы отослать ламеров к документации, компания Netscape делает фатальный ход, минимально необходимый, чтобы все окончательно разрушить — вводит возможность выбора кодировки для страничек, где она не указана!

Естественно, после такого уже никто не считает нужным указывать кодировку документа; раньше останавливало хотя бы то обстоятельство, что были затруднения с просмотром кривых страничек, требующие такой достаточно сложной операции, как замена шрифта ISO 8859-1 на шрифт используемой кодировки, теперь это препятствие было преодолено благодаря попустительству Netscape. Вслед за Netscape этот фатальный шаг делают и производители остальных броузеров, из соображений выживания в конкурентной борьбе. Вернуть все назад невозможно из-за тех же коммерческих соображений...

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

В связи с общей коммерциализацией Интернет такие вещи, как соответствие стандартам, уже перестают быть аргументом, и продукты, ещё следующие им, потихоньку вытесняются в маргинальные области. В общем, процесс повторяет происходящее в социуме, и будет продолжаться до тех пор, пока участников не начнёт тошнить. Этот порог отодвигается все дальше и дальше благодаря удивительным способностям человеческого организма к адаптации...

ВНИМАНИЕ! Иногда я слышу безответственные "мнения"  по поводу того, что указывать кодировку необязательно и не нужно: мол, пользователь у нас не ленивый, выберет вручную. При этом "советчики"  злостно умалчивают о том, что надёжного автоматического определения кодировки не существует и не может существовать в принципе; так что вебмастера, не проставляющие кодировку, с какой-то вероятностью ставят свои странички под удар быть неверно истолкованными разного рода системами автоматической обработки текста, например, поисковыми машинами. Это все равно как вам бы предложили согласиться быть убитым с небольшой вероятностью, скажем 3%. И зачем вам это нужно?

Русские странички не нарушая стандартов - это просто!

Здесь приведена пошаговая инструкция правильной подготовки ваших русских страничек для WWW:

  • Если у вас на страничках стоит выбор кодировок, выкиньте этот кусок HTML кода: он вам больше не понадобится — отныне все будет происходить автоматически.

  • Если у вас странички не в кодировке KOI8-R, перекодируйте их туда каким-нибудь конвертером — смотрите раздел “Символьная перекодировка”. Ничего страшного не произойдёт: если все дальнейшее вы сделаете правильно, то в таком виде их по-прежнему можно будет редактировать, скажем, в Netscape Composer без всякой заметной разницы. Мало того, в таком виде ваши странички будут одинаково хорошо видны для всех операционных систем без всяких переключателей кодировок, превратившихся в бич русского WWW.

  • Внимание! Данный пункт можно пропустить, если на вашем сервере стоит Apache или какая-либо его разновидность (то есть в 90% случаев) — в этом случае необходимая информация может быть задана в настройках Apache. Если же вы предполагаете частые переезды с сервера на сервер с неизвестными HTTPD, следуйте указаниям пункта.

    • Проверьте самую первую строчку ваших русских HTML документов, она должна выглядеть примерно так:

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
      

      Если такой строчки нет, или номер после слова HTML меньше 4.0, добавьте её в самое начало. Примечание для специалистов: атрибут LANG определён только в HTML 4.0 и выше, так что указание DTD обязательно.

    • Замените следующий за ней таг <HTML> на таг <HTML LANG=ru>, это укажет, что ваш документ на русском языке, и облегчит жизнь поисковикам.

  • Спросите вашего веб-мастера, что за штука стоит у вас в качестве веб-сервера, если он ответит:

    • что Apache или Apache/RUS: в самом верхнем каталоге, содержащем ваши странички, создайте файл с именем .htaccess, доступный всем на чтение с такими строчками:

      1. Для версий Apache, начиная с 1.3.12:

        AddDefaultCharset koi8-r
        AddLanguage ru .html .txt
        

      2. Для версий Apache, начиная с 1.3.10:

        AddCharset koi8-r .html .txt
        AddLanguage ru .html .txt
        

      3. Для более старых версий Apache (или если версия вам неизвестна):

        AddType "text/html; charset=koi8-r" .html
        AddType "text/plain; charset=koi8-r" .txt
        AddLanguage ru .html .txt
        

      Если файл .htaccess уже есть, просто добавьте туда эти строчки.

      Записанное в .htaccess распространяется на все подкаталоги вниз по дереву.

      Подразумевается, что ваши HTML документы заканчиваются на .html; если они заканчиваются на .htm, поменяйте .html на .htm в предлагаемом образце.

      При таких настройках не обязательно (но можно) указывать язык тагом <HTML LANG=ru, как это было описано выше.

      Указание языка внутри HTML документа имеет приоритет над указанием для сервера.

      Так как для текстовых (*.txt) документов никак нельзя указать язык внутри документа, указание для сервера — это единственная альтернатива.

      Если у вас на сервере стоит Apache/RUS, то рекомендуется отключить всякую автоматическую перекодировку, добавив в .htaccess директиву

      CharsetTurnOff On
      

      (работает начиная с версии Apache/RUS PL20).

      ПРЕДУПРЕЖДЕНИЕ: в последних версиях Apache обработка файлов .htaccess по умолчанию выключена в главной конфигурации (директивой AllowOverride None), т.е. ваши установки не будут иметь никакого эффекта. В этом случае попросите вебмастера включить такую обработку для вашего каталога, добавив директиву

      AllowOverride +FileInfo
      

      в соответствующую секцию <Directory ...> конфигурации Apache.

    • что NCSA: в каждом каталоге, содержащем ваши странички, заведите файл с именем .htaccess, доступный всем на чтение с такими строчками:

      AddType text/html;\ charset=koi8-r .html
      AddType text/plain;\ charset=koi8-r .txt
      

      Если файл .htaccess уже есть, просто добавьте туда эти строчки.

      Подразумевается, что ваши HTML документы заканчиваются на .html; если они заканчиваются на .htm, поменяйте конец строки на .htm соответственно.

    • что CERN: для каждого вашего каталога с русскими страничками создайте подкаталог .web, в него положите файлы с именами, сконструированными добавлением суффикса .meta к именам в главном каталоге. Каталог .web и файлы в нем должны быть доступны всем на чтение. Например, файлу index.html соответствует файл .web/index.html.meta и т.д. Каждый такой файл должен содержать следующую строчку

      Content-Type: text/html; charset=koi8-r
      

      (для HTML файлов) или

      Content-Type: text/plain; charset=koi8-r
      

      (для текстовых файлов).

    • что какой-нибудь другой HTTP сервер: сперва попробуйте связать расширения .html и .txt по аналогии с решениями выше; если вы не знаете, как это сделать в вашем HTTP сервере, вам придётся редактировать непосредственно сами ваши странички: в секцию <HEAD> каждого HTML документа вставьте самой первой директивой следующий таг:

      <META HTTP-EQUIV="Content-Type"
      CONTENT="text/html; charset=koi8-r">
      

      Т.е. каждый ваш документ должен будет выглядеть примерно так:

      <HEAD>
      <META HTTP-EQUIV="Content-Type"
      CONTENT="text/html; charset=koi8-r">
      <TITLE>Заголовок странички</TITLE>
      </HEAD>
      <BODY>
      Содержимое странички
      </BODY>
      

      К сожалению, в этом случае невозможно указание кодировки для текстовых файлов (*.txt).

На этом всё готово. При просмотре ваших страничек никто теперь не увидит мусора из умляутов вместо нормальных русских букв, и не придётся больше выбирать кодировки!

Проверка правильности кириллизации

Как проверить, удалось ли проставить кодировку и язык в HTTP заголовке?

Допустим, ваша страничка называется http://www.yourserver.ru/yourpath/yourpage.html

  • Наберите: telnet www.yourserver.ru 80

  • После соединения наберите:

    HEAD /yourpath/yourpage.html HTTP/1.0
    

    Если ваша страничка находится на виртуальном сервере, то к приведённой выше строчке следует добавить Host: host.ru

    Возможно, в некоторых системах придётся набирать вслепую.

  • Нажмите Enter два раза. Вы увидите HTTP заголовок.

  • Найдите в нем поле Content-Type и проверьте, что там стоит не просто text/html, а text/html; charset=koi8-r

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

           Content-Language: ru
    

Полезные советы

А совсем старые версии броузеров не показывают русских букв при таком способе, что делать?

Посоветовать пользователю сменить версию броузера на более новую. В качестве прецедента, вспомните, что было с вводом прогрессивных JPEG, или анимированных GIF? Все поменяли версии на новые, никто не жаловался и не делал две копии страничек, одну с GIFами, а другую — без, а потом предлагал бы их выбрать...

А нельзя сделать так, чтобы 1) старые версии работали, 2) новые версии работали, и 3) чтобы пользователю было удобно?

Нельзя. Из этой тройки можно сделать вместе только два, на выбор. Из-за ненависти к пользователю у нас часто делают (1) чтобы старые версии работали и (2) чтобы новые версии работали (при этом стандартам не соответствует), я же предпочитаю (3) чтобы пользователю было удобно и (2) чтобы новые версии работали (при этом стандартам соответствовало), а вы?