WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Кодонезависимый знакогенератор кириллицы.


Прислал: Владимир Бакланов [ 17.09.2003 @ 20:05 ]
Раздел:: [ Веб-технологии ]


Владимир Бакланов

Как известно, в рунете формально действуют 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 с соответствующей кодировкой.

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




 :::::  DiJay пишет 18.09.2003 @ 10:20 
по-моему мета тега вполне достаточно!
 :::::  Croaker пишет 18.09.2003 @ 11:15 
скрипт, к сожалению, большой пользы не принесет, т.к. ИМХО намного надежней один раз нормально настроить сервер, и забыть про проблемы с кодировками.

а что касается вступления, то очень понравилось :)
 :::::  Владимир Бакланов пишет 18.09.2003 @ 19:33 
DiLay:
Не всегда: если сервер принудительно перекодирует, meta-тэг может в лушем случае "сбить" првальную кодировку, в худшем -- сделать текст нечитаемым.

Cracker'у:
Да действительно, если Вы хозяин сервера или можете договорится сос своим хост-провайдером, настройка правильная web-сервера -- это идеальный вариант.
 :::::  Александр пишет 15.10.2003 @ 16:00 
С каких это пор UTF-8 стала "двухбайтовой"? Это кодирова с переменным количеством байтов. Не позорься!
 :::::  Владимир Бакланов пишет 19.10.2003 @ 16:41 
Но ведь речь идёт о кодировках кириллицы, а не о китайских или японских!!!
 :::::  Sergik пишет 11.11.2003 @ 17:13 
И про историю кодировок надобы почитать - а до Инета какие были? ;-)
"пришла вместе с Юниксами из розовых пелёнок интернета"
 :::::  kokaol пишет 08.01.2004 @ 01:07 
А мне помогло!!!!
 :::::    пишет 26.01.2004 @ 12:37 
Владимир Бакланов, однако часто наряду с кириллицей попадается и английский - а для него, в отличии от UNICODE, в UTF-8 отводится всего один байт.
Опера, к примеру, к сожалению иногда "ложит" на прописанный в html-коде charset и отдаёт страницу в том коде, который сообщает ему Apache (попробуйте страницы, сгенерированные с gzip-сжатием).
 :::::  вован_huynya1@yandex.ru пишет 12.12.2004 @ 01:50 
мой dreamweaver не записывает сайты под русской кодировкой.


как можно изменить кодировку страницы с utf-8 на русскую?
очень прошу ответить.

иначе мне не жить
 :::::  Владимир Бакланов пишет 14.12.2004 @ 16:25 
Я понял, что проблема состоит не в принудительном перекодировании web-страницы web-сервером, а в dreamweaver, который на выходе даёт страницу в utf-8.
Если dreamweaver настройками нельзя заставить выдавать страницы в кодировке windows-1251, то нужно в и-нете поискать конвертор, с помощью которого конвертировать их из utf-8 в windows-1251.
 :::::  Shoorick пишет 24.02.2010 @ 22:46 
1. Мета-тэг не нужен. Настройте сервер.

2. Даже кириллица может занимать не два байта в UTF-8. Кириллица — это не только U+4**.
Латинские буквы, как уже сказано выше, занимают в UTF-8 один байт, а некоторые знаки
препинания — три.

3. Зачем искать конвертер? Есть iconv.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0134699