12.7. Перекодирование русскоязычных документов «на лету»

We use cookies. Read the Privacy and Cookie Policy

12.7. Перекодирование русскоязычных документов «на лету»

С тех пор, когда в русском языке появилось слово кодировка, появилась и проблема перекодировки. Стандартной кодировкой русского языка для большинства Unix-серверов является КОИ-8. Аббревиатура КОИ расшифровывается как «Код для Обмена Информацией». Все бы было хорошо, если бы существовала одна-единственная кодировка KOI8-r. Но, как всегда, найдутся добрые люди, которые захотят помочь нам кодировать наш русский язык. И таких нашлось немало. Например, всем известная Microsoft сначала использовала кодировку СР-866 (еще известную как альтернативная кодировка — ALT) в своей операционной системе DOS. ОС DOS тогда была установлена на большинстве домашних и офисных компьютеров, поэтому особой разницы, что использовать: KOI8-r или СР-866, для пользователей не было по одной простой причине: у меня отображается так же, как и у соседа. Потом та же Microsoft разработала кодировку Windows-1251 (ANSI) для своей новой операционной системы Windows. Стараясь нам «помочь», она создала проблемы с перекодировкой уже на локальном уровне: файлы, созданные в ОС DOS, без предварительного перекодирования нельзя было прочитать в Windows, и наоборот. Заметьте, об Интернет и Apache я еще не сказал ни слова.

Кроме Microsoft, «облегчили» нам жизнь также компании Apple и Sun, разработав соответственно кодировки Apple и ISO8859-5. Компания IBM также не отстала от них, разработав собственную кодировку русского языка. В общем, развитие таблиц перекодирования русского языка происходило по принципу: а мы новый дом построим…

А теперь представьте: все эти кодировки смешались в Интернет. Я работаю под Unix и использую KOI8, а вы под Windows и мы не можем прочитать файлы друг друга из-за проблем с кодировкой. Это довольно неудачный пример, так как средств для перекодирования из KOI8 в Windows-1251 разработано довольно много. А вот с кодировкой Apple могут возникнуть проблемы. Мне встречались браузеры, некорректно отображающие русские символы в этой кодировке.

Возникает задача: настроить автоматическое перекодирование документов из одной кодировки в другую. Для начала необходимо настроить хотя бы перекодирование «на лету» из KOI8 в Windows-1251, так как большинство клиентов в Сети используют именно эту кодировку (от Windows, как от смерти, не уйдешь).

Обыкновенный англоязычный Apache, входящий в состав большинства дистрибутивов, не сможет вам в этом помочь. Для корректных операций по перекодированию нужно загрузить и установить сервер Russian Apache. Или же просто установить модуль Apache-RUS. Скачать данный модуль (как и полностью Russian Apache) можно по адресу: ftp://apache.Iexa.ru/pub/apache-ras/. При этом старшая часть версии соответствует оригинальному серверу Apache, младшая — версии модуля Apache-Rus.

Рассматривать процесс установки и настройки я буду на примере не очень новой версии сервера — 1.3.3/PL27.3, это не принципиально. Загрузив файл, распакуйте его:

tar xvzf apache_1.3.3rusPL27.3.tar.gz

После этого перейдите в каталог apache_1.3.3rusPL27.3 и запустите сценарий configure:

# cd apache_1.3.3rusPL27.3

# ./configure

Можно также указать некоторые параметры сценария, например, параметр –prefix=path следует использовать при необходимости установить сервер в другой каталог. Далее введите ставшие уже привычными вам команды:

# make

# make install

После этого нужно настроить сервер, то есть отредактировать его файлы конфигурации. Настройка Russian Apache не отличается от настройки обыкновенного сервера Apache, за исключением настройки модуля перекодирования. Ниже будет рассмотрена настройка именно перекодирования «на лету», так как настройка самого сервера описана в предыдущих пунктах этой главы.

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

CharsetSourceEnc koi8-r

CharsetByExtension windows-1251.txt

Эти директивы находятся в файле httpd.conf. Первая указывает на то, что все файлы на диске, кроме файлов с расширением .txt, хранятся в кодировке koi8-r. Для последних указывается кодировка — windows-1251.

Данные директивы можно включать в блок Location или в файлы .htaccess.

Ко второй группе относятся директивы CharsetDecl, CharsetAlias, CharsetRecodeTable и CharsetWideRecodeTable. Они находятся в блоке <IfModule mod_charset.c> — </IfModule> и не нуждаются в изменении. Необходимо только отметить (это нужно для понимания дальнейшего материала), что директива CharsetDecl используется для объявления кодировки, а CharsetAlias — для объявления псевдонима кодировки, например:

CharsetDecl windows-1251 ru

CharsetAlias windows-1251 win x-cp1251 cp1251 cp-1251

Название языка (ru) должно быть определено в файле conf/srm.conf в директивах Add Language и LanguagePriority.

С помощью третьей, самой многочисленной, группы вы можете настроить сервер для автоматической перекодировки символов на основании информации о клиенте. Например, определив, что клиент работает в операционной системе Windows и кодировкой браузера по умолчанию является Windows-1251, сервер самостоятельно перекодирует файлы в нужную кодировку. Если сервер сделает выбор неправильно, пользователь всегда сможет сам изменить кодировку вручную. Существует три способа выбора кодировки: По каталогу, например:

http://www.server.ru/koi/file.html

http://www.server.ru/win/file.html

По имени сервера, например:

http://koi.www.server.ru/file.html

http://win.www.server.ru/file.html

По порту, например:

http://www.server.ru:8000/file.html

http://www.server.ru:8001/file.html

Теперь рассмотрим каждый из этих способов.

Для перекодирования по каталогу (точнее, по его префиксу) нужно добавить в блоке VirtualHost псевдоним, например:

Alias /koi /www/docs

Или же просто создать в нужном каталоге ссылку на самого себя:

# cd /www/docs

# ln –s . koi

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

При использовании перекодировки по имени сервера следует обратить внимание на то, чтобы указанный вами сервер был прописан на сервере DNS. После регистрации поддомена внесите следующие строки в ваш файл httpd.conf:

# Естественно, укажите здесь свой IP-адрес

<VirtualHost 111.111.111.1>

ServerName www.server.ru

ServerAlias *.www.server.ru

# далее следует обычная конфигурация

</VirtualHost>

В качестве имени поддомена нужно использовать один из псевдонимов кодировки, указанный с помощью директивы CharsetAlias, например, koi или win.

Если же сервер DNS администрируете не вы, а кто-то другой и возможности внести изменения в записи DNS у вас нет, то используйте перекодировку по порту. Для этого удалите (закомментируйте) директиву Port в файле конфигурации httpd.conf и вместо нее добавьте следующие директивы:

Listen 80

Listen 8000

Listen 8001

Listen 8002

Listen 8003

CharsetByPort koi8-r 8000

CharsetByPort windows-1251 8001

CharsetByPort ibm866 8002

CharsetByPort iso-8859-5 8003

Номера портов при этом не очень важны. Думаю, это пример настолько прозрачен, что не нуждается в особых комментариях. Правда, есть одно но: если сеть клиента защищена брандмауэром (см. гл. 14), не позволяющем обращения к выбранному вами порту, клиент не сможет установить соединение с вашим сервером.

Схема (порядок) выбора кодировки определяется директивой CharsetSelectionOrder:

CharsetSelectionOrder Dirprefix Useragent Portnumber Hostname UriHostname — для выбора по каталогу.

CharsetSelectionOrder Hostname UriHostname Useragent Portnumber Dirprefix — для выбора по имени домена.

CharsetSelectionOrder Portnumber Useragent Hostname UriHostname Dirprefix — для выбора по порту.

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

Данный текст является ознакомительным фрагментом.