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

Здесь приведена пошаговая инструкция правильной подготовки ваших русских страничек для WWW применительно к кодировке KOI8-R, не при каких условиях не требующая от пользователя выбора кодировки вручную.

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

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

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

      <!DOCTYPE html>
      
      или, для стардарта HTML 4.01, так:
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
          "http://www.w3.org/TR/html4/loose.dtd">
      
      Если такой строчки нет, или номер после слова HTML меньше 4.01, вставьте её в самое начало. Для страничек с фреймами будет несколько иной вариант:
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
          "http://www.w3.org/TR/html4/frameset.dtd">
      
    2. Замените следующий за ней тэг <HTML> на таг <HTML lang="ru">, это укажет, что ваш документ на русском языке, позволит вам включать автопереносы в стилях для некоторых браузеров и облегчит жизнь некоторым поисковикам.

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

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

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

    что Apache или Apache/RUS ,

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

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

      AddDefaultCharset koi8-r
      AddCharset koi8-r .css
      AddType "text/javascript; charset=koi8-r" .js
      AddLanguage ru .txt .css .js .cgi
      
    • Для версий Apache, начиная с 1.3.10:

      AddCharset koi8-r .html .htm .shtml .txt .css
      AddType "text/javascript; charset=koi8-r" .js
      AddLanguage ru .txt .css .js .cgi
      
    • Для более старых версий Apache (или если версия вам неизвестна):

      AddType "text/html; charset=koi8-r" .html .htm .shtml
      AddType "text/plain; charset=koi8-r" .txt
      AddType "text/css; charset=koi8-r" .css
      AddType "text/javascript; charset=koi8-r" .js
      AddLanguage ru .txt .css .js .cgi
      
    Если файл .htaccess уже есть, просто добавьте туда эти строчки.

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


    При таких настройках не обязательно (но можно) указывать язык тэгом <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/html;\ charset=koi8-r .htm
    AddType text/html;\ charset=koi8-r .shtml
    AddType text/plain;\ charset=koi8-r .txt
    AddType text/css;\ charset=koi8-r .css
    AddType text/javascript;\ charset=koi8-r .js
    
    Если файл .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
    
    (для текстовых файлов) или
    Content-Type: text/css; charset=koi8-r
    
    (для файлов стилей) или
    Content-Type: text/javascript; charset=koi8-r
    
    (для скриптов JavaScript).

    Подробнее об этом методе см. в разделе 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

    7. Повторить то же самое для типа .shtm

    8. Создаём/изменяем соответствующий тип так, чтобы в поле Extension было .css, а в поле Type text/css;charset=koi8-r (обратите внимание на отсутствие пробелов в этой строке);

    9. Создаём/изменяем соответствующий тип так, чтобы в поле Extension было .js, а в поле Type text/javascript;charset=koi8-r (обратите внимание на отсутствие пробелов в этой строке);

    что какой-нибудь другой HTTP сервер,

    сперва попробуйте проассоциировать расширения .html, .htm, .shtml, .css, .js и .txt по аналогии с решениями выше, чтобы получить кодировку в HTTP заголовке. Учтите, что указание кодировки в HTTP заголовке имеет приоритет перед её указанием непосредственно в документе. Вот полный список правил приоритетов, от наибольшего к наименьшему:

    1. Content-Type заголовок в протоколе HTTP;
    2. маркер порядка байтов для Unicode-файлов (BOM);
    3. назначение XML;
    4. META тэг;
    5. атрибут CHARSET (или TYPE с указанием charset) в ссылке.

    Если вы не знаете, как указать кодировку в вашем HTTP сервере, вам придётся редактировать сами ваши странички. Если ваши HTML странички обрабатываются PHP используйте:

    <?php header('Content-type: text/html; charset=KOI8-R'); ?>

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

    метод без вмешательства в конфигурацию сервера.

    В секцию <HEAD> каждого HTML документа вставьте самой первой директивой следующий тэг:

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

    Для стандарта HTML5 можно использовать предыдущую строку или сокращённую форму:

    <META CHARSET="KOI8-R">

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

    <!DOCTYPE html>
    <HTML LANG=ru>
    <HEAD>
    <META CHARSET="KOI8-R">
    <TITLE>Заголовок странички</TITLE>
    </HEAD>
    <BODY>
    Содержимое странички
    </BODY>
    </HTML>
    

    В начало файлов стилей (*.css) вставьте директиву:

    @charset "koi8-r";

    Указание кодировки для текстовых файлов (*.txt) и JavaScript (*.js) скриптов без вмешательства в конфигурацию сервера несколько затруднительно и возможно только для внутренних ссылок. При внешних ссылках не в указанном ниже формате они будут отдаваться в неверной кодировке (что может, в каких-то случаях, компенсироваться алгоритмами автоугадывания конкретного браузера, а может и нет).

    В стандарте HTML 4.01 вы можете использовать следующее:

    <A CHARSET="KOI8-R" HREFLANG="ru"
    HREF="file.txt">file.txt</A>

    В стандарте HTML5 то же самое пишется несколько по-другому:

    <A TYPE="text/plain; charset=KOI8-R" HREFLANG="ru"
    HREF="file.txt">file.txt</A>

    Для скриптов на JavaScript в HTML 4.01 и HTML5:

    <SCRIPT TYPE="text/javascript" CHARSET="KOI8-R"
    SRC="file.js"></SCRIPT>

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

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

Как проверить, удалось ли проставить кодировку и язык в 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

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

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

Посоветовать пользователю сменить версию броузера на более новую. В качестве прецедента, вспомните, что было с вводом прогрессивных 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 документов (англ.) и в принципах работы с кодировками. Также можете ознакомиться с нашими впечатлениями по поводу текущего положения вещей в русскоязычной паутине и предварительным исследованием.

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