Поддержка всех кодировок кирилицы сервером WWW
Опять в кармане ничерта!
Национальная черта...
Владимир Медведев
Для поддержки кирилицы мы вынуждены поддерживать дерево
документов в 7 различных кодировках, по степени значимости:
pure english, koi8, win, transliterated volapuk, alt,
iso_8859_5, macintosh adobe charset
Проблемы "кодировки" english здесь рассматриваться не будут
ввиду необъяснимых политических пристрастий автора, и
технической сложности реализации. А об остальных - поговорим.
На данный момент в различных WWW клиентах (WWW browser)
используются следующие кодировки символов кириллицы:
KOI8-r, koi, koi8
или RFC1489 - рекомендация, которая базируется на
государственном стандарте кода обмена информацией КОИ8
(ГОСТ 19768-74). Применяется в основном на компьютерах с
ОС UNIX. Широко распространена в сети Relcom.
CP-1251, win, windows
Microsoft code page 1251. Применяется в оконной системе
MS-Windows.
CP-866, alt
Microsoft/IBM code page 866 или "альтернативная"
кодировка. Применяется в основном на персональных
компьютерах с операционной системой MS-DOS
ISO-8859-5, iso_8859_5
Международный стандарт. Применяется в основном на различных
компьютерах с ОС UNIX.
Я посчитал какие кодировки viewer'ов использовались
посетителями моей библиотеки.
март апрель июнь август
62% 65% 69% 65% KOI
19% 18% 19% 25% windows
12% 11% 10% 5% volapuk
3% 3% 1% 2% alt
2% 2% 1% 1% iso_8859_5
0% 0% 0% 0% mac
Результаты было легко предсказать, не считая на удивление малый
процент "чайников"-volapuk'истов.
-1. У всех клиентов в мире - MS Windows. И нечего
выпендриваться, существует только одна кодировка русских букв.
0. Цынично и дешево: поддерживаем все 7 деревьев. Периодически
пускаем программу, которая следит и синхронизирует это
безобразие.
1. Все документы выдаем через соответствующий кодировке
cgi-скрипт - http://www.host/cgi-bin/KodEncoding/file/name.html
Скрипт определяет запрошенный документ по переменной
$PATH_INFO, и кидает его, перекодируя на лету.
2. Насилуем сам сервер, и вшиваем перекодировки во внутрь.
3. Сажаем на 7 разных портов, вперед настоящего, демоны
перекодировщики (эдакий proxy). Демон считывает request,
перебрасывает его HTTPD серверу, его выдачу перекодирует и
швыряет в клиента.
4. И всегда помните: была, есть и будет замечательная кодировка
volapuk, по научному называемая phonetic transliterated.
Как определять, какая кодировка нужна клиенту.
Так как пользовательский интерфейс обычно настроен для работы
только с какой-нибудь одной кодировкой, то сервер должен:
определить кодировку клиента;
перекодировать запрос из кодировки клиента в свою локальную
кодировку;
перекодировать результат запроса (документы) из локальной
кодировки в кодировку клиента.
0. Клиент сам должен сказать, установив нам дополнительные поля
заголовка. Что-нибудь типа Accept-charset, Encoding и т.п.
Протокол HTTP 1.0 передает в заголовке запроса перечисление
допустимых форматов документов (MIME content-type) в поле
"Accept:". Клиент может подставить в него виртуальный формат,
соответствующий своей кодировке. Значение этого поля
устанавливается для CGI-скрипта в переменной HTTP_ACCEPT.
Можно использовать виртуальные форматы:
text/x-cyrillic-iso-8859-5
text/x-cyrillic-iso
text/x-cyrillic-iso8859-5 - ISO-8859-5
text/x-cyrillic-koi
text/x-cyrillic-koi8 - KOI8-r
text/x-cyrillic-win
text/x-cyrillic-cp1251 - CP1251 в Windows
text/x-cyrillic-alt
text/x-cyrillic-cp866 - CP866
В новых версиях Mosaic и в Linx 2.3 значение поля "Accept: "
Задается в файле .mailcap - таким образом:
text/x-cyrillic-koi8; more %s
Только вот 99% клиентов делать этого не умеют (и в первую
очередь имеются ввиду клиенты топчущие кнопки).
1. По переменной HTTP_USER_AGENT: *X11* - значит koi, *Win* -
значит win, и т.д. Уже лучше, но насильно мил не будешь, и
пострадают от этого в первую очередь продвинутые юзеры
(например виндюкист не поленившийся выставить себе фонты и
кейборд под кои8)
2. Стартовый каталог запрашиваемого документа: /win, /koi, /lat
3. Номер порта, на который приходит соединение: 80 - koi, 81 -
win, и т.д.
4. Имя сервера, которое использует клиент для захода к нам:
http://www-koi8.*, http://www-win.*, ...
Утверждение: Один и тот же документ в разных кодировках ОБЯЗАН
ИМЕТЬ РАЗНЫЕ URL.
Вопрос: Почему НЕЛЬЗЯ пользоваться неявной перекодировкой
(т.е. в зависимости от типа клиента давать один и тот-же URL в
разных кодировках)?
Ответ: 1. Потому что все нормальные WWW клиенты работают из-за
прокси-сервера - и после того как один виндюкист получит
документ, все остальные юзеры кои8'осьмисты будут получать
откэшированную копию НЕ В СВОЕЙ кодировке. 2. Потому что робот
Альтависты проиндексирует этот документ только в одной
кодировке, а в остальных - его никто не найдет.
CGI-perl скрипт поддержки кодировок в моей библиотеке
Перекодировщик koi8 -> Apple от Александра Фабера
Таблицы перекодировки из KOI8 на языке perl
perl-прогамма, из которой я сделаю "proxy" перекодировщик
Подпрограммки для выбора кодировке на клиенте. Perl
Перекодировщик WWW страниц по заказу
Перекодировщик WWW страниц с продолжением
Заплатки для русификации Apach. Товарного продукта пока нет
Last-modified: Sat, 01 Feb 1997 06:22:39 GMT