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

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

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

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

  2. Если у вас странички не в кодировке KOI8-R, перекодируйте их туда каким-нибудь конвертером: для Win95/98/Me, WinNT/2000/XP/Vista/7, Unix, OS/2, DOS. Ничего страшного не произойдёт: если всё дальнейшее вы сделаете правильно, то в таком виде их по-прежнему можно будет редактировать, скажем, в Microsoft FrontPage без всякой заметной разницы. Мало того, в таком виде ваши странички будут одинаково хорошо видны для всех операционных систем без всяких переключателей кодировок, превратившихся в бич русского WWW.

    ЗАМЕЧАНИЕ: пользователей Windows просят не паниковать, речь не идёт о замене родной для Windows русской кодировки на KOI8-R, её никто трогать не собирается, речь идёт о кодировке документов в русскоязычной сети, это понятие имеет мало общего с кодировкой вашей локальной операционной системы.

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

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

      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
      
      Если такой строчки нет, или номер после слова HTML меньше 4.01, добавьте её в самое начало. Для страничек с FRAMESET будет несколько иной вариант:
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
          "http://www.w3.org/TR/html4/frameset.dtd">
      

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

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

    Что надо сделать дополнительно в случае использования нескольких языков в одном HTML документе и прочие подробности см. в разделе "Language information and text direction" описания стандарта HTML.

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

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

    • Для версий Apache, начиная с 1.3.12:
      AddDefaultCharset koi8-r
      AddLanguage ru .html .txt
      
    • Для версий Apache, начиная с 1.3.10:
      AddCharset koi8-r .html .txt
      AddLanguage ru .html .txt
      
    • Для более старых версий 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 документа имеет приоритет над указанием для сервера. Прочие тонкости указания языка и переключения между несколькими языками внутри одного HTML документа можно посмотреть подробнее в разделе "Language information and text direction" описания стандарта HTML.

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


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

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

    Подробнее об этом методе см. в разделе Method which requires additional HTTP daemon actions (англ.)

    ПРЕДУПРЕЖДЕНИЕ: в последних версиях 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, поменяйте конец строки AddType в .htaccess на .htm

    Подробнее об этом методе см. в разделе Method which requires additional HTTP daemon actions (англ.)



    что 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
    
    (для текстовых файлов).

    Подробнее об этом методе см. в разделе Method which requires additional HTTP daemon actions (англ.)



    что Microsoft IIS/4.0 ,
    Владимир Федорчук пишет:
    1. Запускаем Internet Service Manager;
    2. выбираем требуемый WWW сервер и вызывам его свойства (Properties);
    3. далее выбираем закладку HTTP Header;
    4. потом жмём кнопку File Types;
    5. там создаём/изменяем соответствующий тип так, чтобы в поле Extension было .html, а в поле Type text/html;charset=koi8-r (обратите внимание на отсутствие пробелов в этой строке!);
    6. Повторить то же самое для типа .htm


    что какой-нибудь другой 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).

    Подробнее об этом методе см. в разделе Document-only method, no additional server configuration required (англ.)



    если знаете, как просто сделать для других HTTP серверов,
    напишите мне.

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

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

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

  1. Наберите:
    telnet www.yourserver.ru 80
  2. После соединения наберите:
    HEAD /yourpath/yourpage.html HTTP/1.0
    Host: www.yourserver.ru
    (возможно, в некоторых системах придётся набирать вслепую)
  3. После нажмите Enter ещё раз. Вы увидите HTTP-заголовок.
  4. Найдите в нём поле Content-Type и проверьте, что там стоит не просто text/html, а
    text/html; charset=koi8-r
  5. Если вы на сервере установили русский язык для ваших страничек, в заголовке должно присутствовать поле
    Content-Language: ru

Вопросы и ответы

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

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


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

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

Чтобы устранить всякого рода кривотолки по поводу того, надо или нет ставить charset, привожу в явном виде цитаты из Hypertext Transfer Protocol -- HTTP/1.1 (RFC 2616) , имеющие отношение к вопросу:

3.4.1 Missing Charset

    Some HTTP/1.0 software has interpreted a Content-Type header without charset parameter incorrectly to mean "recipient should guess." Senders wishing to defeat this behavior MAY include a charset parameter even when the charset is ISO-8859-1 and SHOULD do so when it is known that it will not confuse the recipient.

    Unfortunately, some older HTTP/1.0 clients did not deal properly with an explicit charset parameter. HTTP/1.1 recipients MUST respect the charset label provided by the sender; and those user agents that have a provision to "guess" a charset MUST use the charset from the content-type field if they support that charset, rather than the recipient's preference, when initially displaying a document. See section 3.7.1.

3.7.1 Canonicalization and Text Defaults

    ...

    The "charset" parameter is used with some media types to define the character set (section 3.4) of the data. When no explicit charset parameter is provided by the sender, media subtypes of the "text" type are defined to have a default charset value of "ISO-8859-1" when received via HTTP. Data in character sets other than "ISO-8859-1" or its subsets MUST be labeled with an appropriate charset value. See section 3.4.1 for compatibility problems.


Подробности и обоснования смотрите в разделе по написанию русских HTML документов (англ.) и в принципах работы с кодировками. Также можете ознакомиться с моими впечатлениями по поводу текущего положения вещей в русскоязычной паутине и предварительным исследованием.

Полезный ресурс о локализации, кодировках, символах и т.п. - "Локализация, как она есть" .


А вот и интернет магазин
Table of Contents: