Как известно, в рунете формально действуют 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).
Сейчас ситуация утряслась в виду следующих причин:
- оригинальный Apache дорос таки до поддержки русских кодировок;
- web-хостеры (они же владельцы юникс-серверов) догадались отключить перекодирование в Apache.ru или поставили оригинальный Apache, который ничего не перекодирует;
- web-хостеры стали использовать в качестве кодировки хранения windows-1251 (даже на юникс-серверах), что позволило прекратить бесконечное и бессмысленное перекодирование web-страниц при их передаче браузерам клиентов, работающих преимущественно под Windows.
- все современные версии браузеров научились автоматически определять кодировку HTML-страницы (meta-тэг charset – это самое лучшее решение, на 100% гарантирующее правильное отображение кириллицы)
Как ни странно, парадокс ситуации состоит в том, что монополия какой-то одной кодировки (ей оказалась windows-1251) – это благо для всех, в отличии от бардака, создаваемого несколькими конкурирующими кодировками.
В память о беспределе перекодировок я создал знакогенератор, который нечувствителен к любым самым садистским сочетанием кодировок и перекодировщиков, на любых платформах, с любой комбинацией meta-тэгов charset или их полным отсутствием, для любых браузеров с поддержкой спецификации HTML 4.0+ и JavaScript.
Для однобайтовых кодировок (KOI-8R, windows-1251, IBM866 [или DOS cp866], ISO-8859-5, Mac) знакогенератор кириллицы имеет следующий вид:
Сохраните этот код в виде файла, например, “encode.html” и просмотрите в браузере. Попробуйте перекодировать файл в разные кодировки. Попробуйте менять кодировки просмотра в браузере. Русский текст должен читаться всегда.
Если некоторые страницы имеют двухбайтовую кодировку UTF-8, то скрипт нужно немного модифицировать:
Только не забывайте, что meta-тэг charset=UTF-8 указывать нельзя, иначе скрипт не будет работать. Однако, стоит отметить, что скрипт № 2 имеет чисто теоретическое занчение, нежели практическое. Это связано с тем, что web-страницу в двухбайтовой кодировке UTF-8 вообще-то бессмысленно размещать на сервере с автоматическим перекодированием контента, так как это приведёт к невосстановимой порче HTML-кода. Для публикации сайта в UTF-8 нужно найти хостера, не использующего перекодирование. При наличии такого хостера сайт можно публиковать в любой кодировке и тогда все эти скрипты не нужны, просто на каждой странице нужно поставить meta-тэг charset с соответствующей кодировкой.
Надеюсь, что этот знакогенератор Вам не пригодится при отсутствии проблем с кодировками, а при наличии оных кому-то поможет.