Из жизни кодировок
12 мая 2008
Рубрика: Интернет и сети.
Автор: .

pic

Поводом для написания статьи послужила новость, опубликованная в блогах Гугля о том, что количество сайтов в Интернете в кодировке UTF-8 превысило количество сайтов в кодировке ASCII. На прилагаемом графике виден рост сайтов, созданных в Unicode – голубая линия, и падение доли сайтов в ASCII – в начале мая две линии пересеклись.

pic

Вопрос о кодировках – один из самых интересных в истории и технологии информационных технологий. Я лично столкнулся с кодами, работая инженером по внедрению обработки деталей на станках с ЧПУ. Часто возникала необходимость что-то перебить в управляющей перфоленте, нужно было найти нужный кадр, нужный адрес в нем и соответствующую строку на ленте. Для этого у нас были «подсказки» — специальный шаблончик с расшифровкой комбинаций отверстий на перфоленте.

pic

Для тех, кто не видел перфоленту привожу ее фотографию из виртуального музея, есть специальная страничка, посвященная истории носителей информации — http://computerhistory.narod.ru/nositeli_inf.htm — интересная подборка. Так вот, возвращаясь к истории, знакомый программист удивился, увидев наши шпаргалки, говорит, зачем запоминать все комбинации пробивок, если есть коды символов? Каждая дорожка соответствует степени двойки, например, нулю соответствую пробивки на пятой и шестой дорожках, это значит два в четвертой степени надо сложить с двойкой в пятой степени, или 16 + 32 = 48 – это и есть код символа «нуль». У единица код 49 – добавляется пробивка в первой дорожке – два в нулевой степени (и в восьмой – для четности, но это уже не важно). Буква «А» имеет код 65 – два в шестой степени и два в нулевой – пробивки на седьмой и первой дорожках) и восьмой для четности). Буква «B» имеет код 66 и так далее. Речь шла, конечно же, о буквах латинского алфавита, о кириллице в те годы разговоров не велось.

Так уж случилось, что первыми в вычислительной технике были американцы, язык для отображения текста использовался, конечно же английский, что поставило все остальные народы перед проблемами с отображением их национальных символов. Да и в самой Америке сначала было не все так радужно – начиная с 50-х годов прошлого века многочисленные лаборатории и группы разработчиков создавали свои способы отображения символов. Постепенно стало ясно, что подобная ситуация не устраивала покупателей компьютерной техники и шла вразрез с национальными интересами США — ведь буквы английского языка в каждой из указанных систем кодировались по-своему, и это тормозило развитие национальной сферы IТ в США. Поэтому американскому национальному стандартизирующему органу — ASA (позднее – ANSI, American National Standards Institute) — была поставлена задача решить проблему путем разработки единого государственного стандарта на систему кодирования символов естественных языков в машинно-читаемом виде.

Был организован специальный комитет (X3.4 Committee), для работы в котором были приглашены представители крупнейших корпораций-производителей компьютерной техники. Крупнейшие разработчики согласились принять участие в этой работе, поскольку на тот момент путаница в области систем кодирования достигла такой степени, что, очевидно, стало причинять проблемы уже и им самим. Ведь речь шла уже о том, что из-за использования разных систем кодирования символов стал невозможен обмен информацией даже между двумя компьютерами, произведенными одной и той же корпорацией, но принадлежащими к разным «линейкам» или семействам. «У нас существовало более 60 различных систем, использовавшихся для кодирования символов естественных языков в компьютерах. Это было самое настоящее «вавилонское столпотворение», — констатировал в интервью американскому журналу «ComputerWorld» Боб Бемер (Bob Bemer), с 1956-го по 1962 годы — работник корпорации IBM и один из главных разработчиков системы ASCII, которая в 1963 году была принята ANSI в качестве государственного стандарта США на кодирование символов естественных языков в машинно-читаемом виде. При этом принята она была в недоработанном виде; окончательная версия системы ASCII (American Standart Code for Information Interchange) была утверждена в 1968 году.

А так, как СССР пошел по пути копирования западных образцов, перечеркнув свои родные достижения в вычислительной технике, то естественно, что кодировка ASCII стала «родной» и для всех устройств в СССР, и вообще – во всех странах мира, имеющих алфавит, отличный от английского. Естественно, что все обратили взоры на восьмой бит (тот самый, который в перфоленте использовался для проверки на четность) – ведь для кодировки символа используется один байт, он состоит из восьми бит, первые 7 использованы в ASCII для английских символов, а восьмой – не задействован, хотя его использование позволило бы расширить количество используемых символов со 127 до 256. Естественно, каждые страны на свой вкус стали задействовать пространство «восьмого бита». Начали и в СССР, а позже в России, как всегда несогласованно и вразнобой.

Первая попытка успешная русской кодировки, появившаяся еще в 70-х годах при адаптации к русскому языку систему UNIX называется KOI-8. Она успешно дожила до наших дней, хотя и сдала позиции в Вебе. Потом началось победное шествие персональных компьютеров. На заре этого шествия у экранов CGA и Hercules-ов символы были прошиты в знакогенераторов, естественно, только английские. Для работы с русскими текстами использовались специальные программы, например, популярнейший «Лексикон», генерирующие в прошивку кириллические символы. Если помните, то и для печати на матричных принтерах надо было сначала запускать программу с кириллическими символами, потом уже выводить текст. Позже появились мониторы EGA с программной подгрузкой символов – чарсетов. Кодировок было несколько – ГОСТ на кириллицу, который так и не прижился, была еще болгарская раскладка, пришедшая с «Правцами» — тоже не прижилась, постепенно стала доминировать раскладка, альтернативная ГОСТ-овской – IBM866, она же «кодировка DOS», она же СР866 где СР – Code Page. Эта кодировка кроме букв кириллицы имела еще символы псевдографики, например, двойные и одинарные рамки, градиентный фон и другие, что позволяло красиво оформлять экранные меню в ДОС-овских программах. А они работают до сих пор – загляните, например, в монитор оператора абонентского отдела любой АТС – явно программа, написанная на непотопляемом FoxPro.

С приходом эры Windows воцарилась кодировка СР1251 – в первых 127 символах она, естественно, совпадает с ASCII, а вот расширение для кириллицы с кодом ДОСовской раскладки СР866 не совпадает, ибо необходимость в символах псевдографики исчезла. Это несовпадение доставляет много хлопот тем, кто переводил, например, программы, написанные на FoxPro под DOS в систему Windows, приходится конвертировать все базы данных в новую кодировку.

Удалось найти интересный фрагмент из обсуждений в FIDO в 1996 году.

Году так в 1991 (или это было в 1990?) Микрософт, серьезно озаботился локализацией своих продуктов для советского рынка. Очевидно, встал вопрос о кодировке. И вроде бы Микрософт запросил мнение российских программистов о кодовой таблице. И вот, в один прекрасный день человек 15-20 собралось в старом здании Параграфа на Петровском бульваре, чтобы выработать согласованное предложение для Микрософта. Hе могу назвать всех участников, большинство я тогда не знал, вот те, которые помню: Антон Чижов из Параграфа (он председательствовал), Петя Квитек из Диалога), по-моему, был еще Игорь Баздырев (автор Паравина).

Консенсус был достигнут довольно быстро (по-моему, вся встреча длилась часа 2). Я смутно припоминая, что доводы были примерно такие (только не надо открывать дискуссию, это уже история, и тут ничего не изменишь):
— алфавит должен быть упорядочен (кроме буквы e:)
— сначала uppercase, потом lowercase
Конец цитаты.

Еще надо добавить, что было несколько попыток проникновения МАС-ов на территорию экс-СССР, это породило и МАС-овскую кириллическую кодовую таблицу символов. Если помните, на сайтах в 1998-200 годах предлагали выбрать кодировку – Win1251, KOI-8 или МАС – бывший ГОСТ, болгарская раскладка и ДОС до эры Интернета успешно не дожили.

Естественно, что состояние с национальными колировками, при котором на расширение отдавался лишь восьмой бит байта не устраивало никого кроме англоязычных стран. А ведь в таких странах как Корея, Япония, Китай символов не десятки, а сотни и тысячи. Поэтому была создана специальная группа для разработки новой, устраивающей всех кодовой таблицы. Эта таблица получила название UNICODE, официальный сайт разработчиков — http://www.unicode.org/. Если в статьях 2000-2002 годов о ней говорили в будущем времени, то, начиная с 2003 года, пошло все более успешное внедрение стандарта и ныне он сравнялся по популярности с ASCII и имеет тенденцию роста. В UNICODE для кодирования символа используются 2 байта, что позволяет закодировать 65 535 символов. Сюда с запасом войдут все известные ныне языки на Земле, все исчезнувшие и вновь создаваемые языки. Все задействованные коды символов можно посмотреть на специальной странице — http://www.utf8-chartable.de/unicode-utf8-table.pl?start=1024 – видно, что кириллица занимает позиции от U+0410, соответствующего букве «А» до U+044F соответствующего букве «я», причем, буква «Ё» стоит «не на месте».

Немного о терминологии. UNICODE – это набор символов. Для того, чтобы браузер нормально его распознал, над ему указать на специальную кодировку «UTF-8». Делается это в метатеге в начале веб-страницы:

<meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″ />

Кодировка UTF-8 это уже не просто набор символов, но и некоторая программная обработка. Например, для символов того же английского языка в UTF-8 текст по-прежнему отображается одним байтом, для расширенных символов кириллицы, иврите, иероглифов, скандинавских, индийских и африканских текстов задействуется второй байт. Можно встретить рассуждения о том, что страница в кодировке UTF-8 вдвое тяжелее, чем в Win1251. Это и так и не так одновременно. Во-первых, сам код HTML пишется на английском языке и остается однобайтовым, во вторых, все цифры, вкрапления латинскими буквами и английские знаки пунктуации – однобайтовые. За счет больших текстов на кириллице или другом неанглийском языке объем страницы может возрасти процентов на 30. Но, по сравнению с графикой, флеш-анимацией, джава-скриптами, внедренными в страницу, это увеличение составляет незначительную часть от объема сайта. Зато преимущества от такой кодировки очевидны. На странице http://arbuz.uz/t_international.html я собрал коллекцию — одна и та же фраза выложена на десятках разных языков – армянском, иврите, арабском, греческом, японском, исландском, казахском, чешском – в их национальных кодировках. Все работает – правда, у вас должен быть на компьютере шрифт, поддерживающий UNICODE, но при установленной Windows XP обычно с этим проблем не бывает.

Orphus system
В Telegram
В Одноклассники
ВКонтакте