Как известно, в рунете формально действуют 6
русских кодировок: однобайтовые windows-1251, KOI-8R, IBM866, ISO-8859-5,
русская Mac и двухбайтовая UTF-8.
Проблема русских кодировок в Интернете сейчас уже практически решена за счёт
фактической монополизации Web’а кодировкой windows-1251 от Microsoft, которая
является родной для 80-90% рабочих станций, работающих под управлением Windows
всех версий.
Некогда лидирующая кодировка KOI-8R оттеснена на второй план. Ещё недавно она
была основной, т.к. пришла вместе с Юниксами из розовых пелёнок интернета.
KOI-8R – дитя технологического несовершенства, когда русским духом в интернете и
не пахло (в ней буквы расположены не по алфавиту, а по сходству произношения с
английскими буквами). Надо было как-то передавать 8-битные русские буквы через
7-битные англоязычные почтовые серверы и никто не гарантировал, что экзотическая
кириллица дойдёт до адресата не в виде абракадабры. Так и родилась KOI-8R: если
англицкие серверы отсекали старший бит, то русский текст доходил условно
читабельным, правда на руглише (русские слова английскими буквами). В
электронной почте эта кодировка до сих пор считается стандартом, даже дядя Билли
до сих пор оставил её по умолчанию в своём почтовом клиенте Outlook Express.
В кодировке IBM866 (она же DOS CP-866) web-страницы писать не стали, так как
старушка DOS исчезла с наших компьютеров раньше, чем интернет добрался до
народных масс. Практически все юзеры смотрели web из окон, а вот из DOS’а –
почти никто.
Кодировки ISO-8859-5 и русскую Mac можно считать экзотическими, первая нигде и
ни кем не использовалась (видимо дяденьки из ISO высосали её из пальца), а маки
в нашей стране – это скорее диковинка, чем реальность.
UTF-8 – сравнительно новая двухбайтовая кодировка, призванная заменить весь
существующий зверинец старых кодировок. Но что-то никто не торопится это делать.
И хотя для XML-документов кодировка UTF-8 является стандартной по умолчанию, в
и-нете её не найдёшь днём с огнём (равно как и самих XML-документов :-).
Таким образом, в переходный период борьба шла в основном между кодировкой
хранения web-страниц KOI-8R, так как практически все интернет-серверы работали
под юниксами, и кодировкой пользователей windows-1251, которые смотрели эти
страницы из окон 95 или 98 калибра. Поэтому и возникла проблема перекодировки
web-контента. Результат этой борьбы – время от времени созерцание в браузере
абракадабры вместо русского текста.
Чехарда с кодировками не оставила равнодушными наших талантливых и вездесущих
программистов. Они взяли популярный web-сервер Apache, который родом тоже из
юниксов, и написали для него патчи русификации, благо Apache является программой
с открытым исходным кодом. Получился русский
Apache, который принудительно перекодировал русское содержимое web-страниц
по определённым правилам. Оригинальный Apache
в то время ни сном ни духом не слышал о многообразии кодировок кириллицы.
Русский Apache создал ещё больше проблем. Это я испытал на свое шкуре. При
выдаче web-страницы по запросу браузера Apache.ru перекодирует её из кодировки
хранения (koi-8r) в кодировку клиента (например, windows-1251). Допустим на
сервере лежит HTML-код в koi8-r, в заголовке страницы, как и положено, стоит
meta-тзг:
При передаче браузеру в Windows
происходит перекодировка koi > win. Таким образом, текст страницы оказался в
кодировке windows-1251, а в заголовке по прежнему стоит тот же meta-тэг charset
и koi8-r будет установлена браузером, в результате чего web-страница будет
нечитабельной. Юзеру придётся вручную выбрать нужную кодировку.
Чтобы избежать таких ситуаций из заголовков web-страниц пришлось вообще выкинуть
meta-тэг charset. Но всё равно нет гарантии, что кодировка клиента будет
определена корректно, так как кодировка браузера по умолчанию может не совпасть
с кодировкой HTML-документа. А если web-страницу ошибочно опубликовать на
сервере в кодировке windows-1251, то при перекодировании koi > win русский текст
в браузере окажется в неизвестной кодировке, то есть окончательно испортится.
Короче говоря, web-мастерам пришлось бороться с принудительным перекодированием
в Apache.ru. (например, с помощью настроек Apache или файла .htaccess).
Сейчас ситуация утряслась в виду следующих причин:
1) оригинальный Apache дорос таки до поддержки русских кодировок;
2) web-хостеры (они же владельцы юникс-серверов) догадались отключить
перекодирование в Apache.ru или поставили оригинальный Apache, который ничего не
перекодирует;
3) web-хостеры стали использовать в качестве кодировки хранения
windows-1251 (даже на юникс-серверах), что позволило прекратить бесконечное и
бессмысленное перекодирование web-страниц при их передаче браузерам клиентов,
работающих преимущественно под Windows.
4) все современные версии браузеров научились автоматически определять
кодировку HTML-страницы (meta-тэг charset – это самое лучшее решение, на 100%
гарантирующее правильное отображение кириллицы)
Как ни странно, парадокс ситуации состоит в том, что монополия какой-то одной
кодировки (ей оказалась windows-1251) – это благо для всех, в отличии от
бардака, создаваемого несколькими конкурирующими кодировками.
В память о беспределе перекодировок я создал знакогенератор, который
нечувствителен к любым самым садистским сочетанием кодировок и перекодировщиков,
на любых платформах, с любой комбинацией meta-тэгов charset или их полным
отсутствием, для любых браузеров с поддержкой спецификации HTML 4.0+ и
JavaScript.
Для однобайтовых кодировок (KOI-8R, windows-1251, IBM866 [или DOS cp866],
ISO-8859-5, Mac) знакогенератор кириллицы имеет следующий вид:
Скрипт № 1
Сохраните этот код в виде файла,
например, “encode.html” и просмотрите в браузере. Попробуйте перекодировать файл
в разные кодировки. Попробуйте менять кодировки просмотра в браузере. Русский
текст должен читаться всегда.
Если некоторые страницы имеют двухбайтовую кодировку UTF-8, то скрипт нужно
немного модифицировать:
Скрипт № 2
Только не забывайте, что meta-тэг
charset=UTF-8 указывать нельзя, иначе скрипт не будет работать. Однако, стоит
отметить, что скрипт № 2 имеет чисто теоретическое занчение, нежели
практическое. Это связано с тем, что web-страницу в двухбайтовой кодировке UTF-8
вообще-то бессмысленно размещать на сервере с автоматическим перекодированием
контента, так как это приведёт к невосстановимой порче HTML-кода. Для публикации
сайта в UTF-8 нужно найти хостера, не использующего перекодирование. При наличии
такого хостера сайт можно публиковать в любой кодировке и тогда все эти скрипты
не нужны, просто на каждой странице нужно поставить meta-тэг charset с
соответствующей кодировкой.
Надеюсь, что этот знакогенератор Вам не пригодится при отсутствии проблем с
кодировками, а при наличии оных кому-то поможет.