Полезные опыты со шрифтами

pic
— Как, ты заговорил, Тотошка!? — с удивлением вскричала
изумленная Элли.
— Не знаю, как это получается, Элли, но, ав-ав, из моего
рта невольно вылетают человеческие слова…
А. Волков. Волшебник Изумрудного города.

Часть первая, историческая

Проблема с кодировкой известна каждому пользователю, так как все иногда получают письма с немыслимыми «кракозябрами» вместо текста или открывают веб-страничку в нечитаемом виде. Проблема эта, кроме наших личных неудобств, связана с многомиллионными затратами, геополитическими интригами и борьбой за лидерство в IT-индустрии и монополией на многие интернет-процессы. Рассмотрим вкратце ситуацию с кодировками.

Разные кодировки известны очень давно. Если не отвлекаться на такую экзотическую область, как нотная запись звуков, то первым кодом можно признать азбуку для незрячих Луи Брайля. В ее основе лежит двоичный код – из шести ячеек с позиций каждая ячейка может быть выпуклой или гладкой. Это позволяло закодировать 26=64 символа. Но Брайль разработал расширители кода (аналог клавиши Shift), действующие на символы до отмены расширителя, и изменения одного символа (современные escape-коды). Следующими «великими кодировками» были, конечно же, азбука Морзе и код Бодо для телетайпной ленты. Подробнее прочесть захватывающую историю кодировок можно на http://arbuz.uz/x_revich_code.html
Вообще говоря, компьютер оперирует с цифрами (еще точнее, с их представлением в двоичном виде, но это уж совсем нас уведет в сторону), и ему, образно говоря, все равно, на каком конкретном языке к нему обращаются. Это проблема программ-перекодировщиков привычных букв и цифр в их цифровое представление, согласно условно принятым таблицам кодов. В пятидесятые-шестидесятые годы каждый разработчик вычислительной техники создавал свои таблицы кодов. Были разные ГОСТы в бывшем СССР, мне, например, удалось застать пятидорожечную перфоленту с кодом БЦК-5, вытесненную позже восьмидорожечной ISO-7bit. Но, как мы теперь знаем, основная кухня, в которой создавалась компьютерная отрасль, находилась в США. (Любителям истории техники, желающим узнать о соотношении вкладов советских и американских, рекомендую прочесть статью на http://arbuz.uz/x_revich_znsila.html) Американские корпорации также продвигали свои собственные кодировки, пытаясь достичь конкурентных преимуществ, привязывая покупателей к своей линейке оборудования.

Постепенно стало ясно, что подобная ситуация не устраивала покупателей компьютерной техники и шла вразрез с национальными интересами США — ведь буквы английского языка в каждой из указанных систем кодировались по-своему, и это тормозило развитие национальной сферы 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 году.

В июне прошлого (2004) года компьютерный мир обошла скорбная новость. На 85-м году жизни от рака скончался один из первопроходцев компьютерной индустрии Боб Бемер. Этот человек занимался компьютерами с 1949 года. Именно он придумал клавиши как «Esc» и «/», имеющиеся сегодня на любой компьютерной клавиатуре. Он являлся одним из создателей кодировки ASCII. Это новшество позволило покончить с разнобоем, когда каждая фирма создавала свои кодовые таблицы, что было необычайно важно для последовавшей всеобщей компьютеризации. По имеющейся информации, Бемер еще в 1970 году говорил о проблеме 2000 года, вызвавшей большой шум накануне начала нового тысячелетия.

В 1967 году ISO выпускает рекомендацию ISO 646, которая фактически сделала систему ASCII уже международным стандартом. И это при том, что система ASCII заведомо не удовлетворяла самым очевидным требованиям, предъявляемым к системе кодирования символов, пригодной для международного применения.
Как известно, количество одних только ныне используемых естественных языков, используемых в мире, превышает 2500. Общее количество символов, используемых только в одном из них — японском, к примеру, превышает 65000. В системе ASCII же для кодирования каждого символа использовалось 7 бит, а ее таблица символов содержала 128 (27=127) позиций (из которых 32 были отведены под управляющие последовательности, а собственно под символы было отведено, соответственно, 96). Среди этих 96 позиций 52 были уже забронированы за заглавными и строчными буквами английского алфавита, 10 — за арабскими цифрами, прочие — за различными знаками препинания и специальными символами. Для изображения символов и букв «всех прочих» национальных языков, кроме английского, ISO определила в этой таблице «открытые позиции» общим количеством… 10 штук.

Чтобы обеспечить «поддержку» работы с другими языками, кроме английского — не «работу», а именно «поддержку», рассматриваемую ISO, таким образом, как нечто опциональное! — предлагалось использовать технические ухищрения — управляющие последовательности (escape-последовательности). После того, как компьютер встречал в тексте специальную управляющую последовательность, считалось, что произошла смена стандартной таблицы символов, используемой в ASCII, на одну из «дополнительных», содержащую символы того или иного «дополнительного» языка. Таких «дополнительных» таблиц ISO было утверждено в общей сложности более 180!

Затем систему кодирования ASCII пересмотрели и для кодирования каждого символа стали использовать не 7, а 8 бит (этот 8-й бит существовал и ранее, но использовался не для представления данных, а для осуществления контроля четности). Заметим, что в тексте стандарта ASCII такое «расширение» никак не регламентировано. Это привело к многочисленным проблемам, так как существующее на тот момент ПО работало с ASCII в его оригинальном виде.

Объем таблицы символов возрос до 256 (28=256) позиций. Это позволяло отказаться от использования управляющих последовательностей для обеспечения работы с некоторыми языками, символы которых можно было уместить в появившееся место. ISO выпускает стандарты ISO 2022 и серию стандартов ISO 8859-X (X — цифра от 1 до 15), описывающие, как следует задействовать новую возможность.
Надо отметить, что свободных позиций там было не так уж и много, так как некоторые были уже зарезервированы за псевдографическими символами. Такие символы необходимы при работе в текстовом «режиме работы», первоначально созданном корпорацией IBM в семействе своих видеокарт, примененном в компьютерах PC.

Серия стандартов ISO 8859-X по заказу ISO разрабатывалась с середины 1980 годов, ассоциацией крупнейших европейских производителей компьютерной техники (ECMA, European Computer Manufacturer’s Association). В каждом из этих стандартов были определены 15 разных таблиц символов, каждая из которых содержала 256 позиций. При этом оговаривалось, что первые 128 символов каждой таблицы должны обязательно быть теми же самыми, что в стандартной 128-символьной таблице системы ASCII (и рекомендации ISO 646). Таким образом, в каждой из этих таблиц вновь обеспечивалась неприкосновенность для символов английского языка. Для представления символов других языков отводились остающиеся позиции, во вторых половинах этих 256-символьных таблиц.

Совершенно очевидно, что определенная в ISO 8859-X схема заведомо неприемлема, так как в ней символы разных языков обозначаются одними и теми же двоичными последовательностями, и определить, какую именно таблицу символов использовать для их прочтения — ISO 8859-1 или же, например, ISO 8859-5, — невозможно, если не знать этого заранее.

Таким образом возникали ситуации, когда даже для одного и того же языка сосуществовали две, а то и большее количество таблиц символов, несовместимых между собой и без наличия дополнительной информации программно неразличимых.
Возьмем в качестве примера многострадальный русский язык. Для кодирования больших и малых букв русского алфавита используются следующие несовместимые или не полностью совместимые между собой таблицы:

  • ISO использует таблицу «Cyrillic»,
    описанную в стандарте ISO 8859-5
  • корпорации IBM и Microsoft в своих ОС PC DOS и MS DOS
    использует таблицу CP866,
  • корпорация Apple в русскоязычной версии своей ОС Mac OS
    использует свою таблицу X-Mac-Cyrillic
  • корпорация Microsoft в своих ОС Windows 3.X и Windows 9X
    использует таблицу CP-1251. CP-1251 — это также представитель целой
    серии таблиц (CP-125X, где X — от 0 до 8), использованных Microsoft в
    различных «национальных» версиях Windows. При этом
    в документации к Windows 3.X Microsoft называет их «ANSI
    charsets», и вполне возможно, что они действительно были
    где-то и когда-то стандартизированы ANSI
  • советский (теперь — российский) национальный
    стандартизирующий орган ГОСТ определяет таблицу КОИ-8 (ГОСТ 19768-74; в
    этом стандарте определяется также 128-символьная таблица КОИ-7), затем
    — таблицу, известную как «основная кодировка ГОСТ»
    (ГОСТ 19768-87). (Впоследствии, правда, ГОСТ принял
    «альтернативную кодировку», таблица которой
    соответствовала, за малым исключением, таблице CP866 — только было уже
    поздно).

Часть вторая, практическая

Небольшая тренировочка для желающих увидеть все символы с их кодами. Воспользуемся мощью Excel’a. В новом листе встаньте на ячейку С1 и введите в нее тест =СИМВОЛ(СТРОКА()+(СТОЛБЕЦ()-1)*16-1). Потом распространите его (потянув мышкой за крестик в правом нижнем углу ячейки С1) на диапазон до ячейки Р16. И сразу увидите желаемые символы. Причем тем типом и размером шрифта, который у вас является текущим.

pic

Всем хороша наша таблица для просмотра написания всех символов, кроме мелочи – не выведены коды символов, а ведь мы хотели разглядеть хорошенько эти коды и пользоваться таблицей для справки. Снова засучиваем рукава и меняем содержание ячейки С1: =ТЕКСТ(СТРОКА()+(СТОЛБЕЦ()-1)*16-1;»0″) &» «&СИМВОЛ(СТРОКА()+(СТОЛБЕЦ()-1)*16-1). То есть добавляем посчитанный код с переводом его в текстовый формат и даем команду слияния двух участков текста, точнее, трех, так как добавим пробел для удобочитаемости. Распространяем таким же образом на тот же диапазон и рассматриваем результат.
Обратите внимание, что символы с кодами менее 32 в ср1251 не имеют значков.

Часть третья, ознакомительная

Для решения проблемы глобального охвата планеты корпорации IBM и Xerox еще в первой половине 1980-х начали работу над созданием новой «многоязычной» системы кодирования, в которой для представления символов используются двоичные последовательности длиною в 16 бит, а также единая большая таблица символов объемом в 65536 позиций. Впоследствии к этим корпорациям присоединились другие, и был начат проект, названный представителями американской компьютерной индустрии «Unification Code», или Unicode. Причем дошло до того, что в 1991 году эти корпорации (в их числе также Adobe, Microsoft и др.) для продвижения Unicode в качестве международного стандарта создали одноименный транснациональный консорциум.

Главной задачей Unicode официально было объявлено сведение существующих в мире символов естественных языков в указанную большую таблицу и обеспечение одновременной и равноправной работы с ними.

Таблица символов, используемая в Unicode, устроена следующим образом. Она разбита на 256 рядов. Первые ряды содержат некоторые из старых таблиц символов (объемом в 128 или 256 позиций каждая), определенных для некоторых языков. Самый первый ряд (под номером 0) представляет собой таблицу ISO 8859-1 (в свою очередь, она содержит 128 символов из таблицы 7-битной системы ASCII, а также некоторые символы, используемые в языках стран Западной Европы).

Последующие ряды таблицы отведены под некоторые новые символы (например, математические), но преимущественно — под иероглифы. В общей сложности в таблице символов системы Unicode насчитывается около 28000 иероглифов.
Система Unicode присваивает уникальный код любому символу, независимо от платформы, независимо от программы, независимо от языка. Unicode был принят как стандарт такими лидерами компьютерной индустрии, как Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys да и многими другими. Именно эта схема кодирования используется такими современными технологиями и стандартами, как, например, XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML и так далее. Именно Unicode является официальной схемой реализации ISO/IEC 10646. Наконец, эта кодировка поддерживается во множестве операционных систем, во всех современных браузерах и в большом количестве других программ. Повсеместное распространение стандарта Unicode, как и доступность поддерживающих его средств, в настоящее время является одним из наиболее важных направлений развития индустрии программного обеспечения.

Использование Unicode в многоуровневых приложениях или программных комплексах, построенных в рамках архитектуры клиент-сервер, а также при представлении данных в сети Интернет, приводит к значительному снижению расходов на поддержку этих продуктов или сервисов по сравнению со случаем использования старых схем кодирования. Действительно, Unicode позволяет создавать единый программный продукт или сайт Интернета для множества платформ, языков и стран без каких-либо переделок. А его использование при передаче данных между различными системами предохраняет эти данные от повреждения.

pic

Стандарт Unicode был предложен некоммерческой организацией Unicode Consortium, образованной в 1991 году. Для представления каждого символа в этом стандарте используются два байта, что позволяет закодировать очень большое число символов 65535 из разных письменностей: в документах Unicode могут соседствовать русские, латинские, греческие буквы, китайские иероглифы и математические символы.
Кодовые страницы становятся ненужными.

К сожалению, редко какой UNICODE TrueType шрифт содержит все 65535 возможных символов. Первым самым популярным таким шрифтом стал шрифт Arial Unicode MS, содержащий все знаки, идеограммы и символы, определенные в стандарте Юникод версии 2.1. Этот шрифт поставляется с MS Office 2000/XP. То есть шрифт с 2000 года поставляется с очень популярной программой, и об этом шрифте можно говорить как о стандартом, включенном в поставку. У ~95% пользователей MS Windows установлен и MS Office (при установке отметить галочкой среди дополнительных шрифтов либо просто скопировать файл ARIALUNI.TTF из дистрибутива).
Процент пользователей MS Windows из аудитории пользователей любого сайта почти равен 100%. Шрифт можно установить и на Windows 95/98. Следовательно, можно говорить о практически 100%-ной доступности страницы, использующей шрифт Arial Unicode MS. Узнать, установлен ли у вас этот шрифт, можно зайдя на страничку http://arbuz.uz/t_international.html, на которой одна фраза написана на десятках языках мира. Вы можете прочесть ее на иврите, на армянском, норвежском, японском, татарском и прочих языках в их родной кодировке. Если же у вас не установлен шрифт Arial Unicode MS, то вы увидите вместо национальных букв обычные квадратики. Пользователям, не нашедшим этот файл в установочном диске, придется скачать его с сайта Microsoft. Заодно будет решена проблема просмотра страниц, созданных на узбекском языке кириллицей. Все буквы с элементами присутствуют в шрифте Arial Unicode MS, и в тексте достаточно указать их коды.

Если вы создаете веб-страницу на узбекском языке кириллицей, то для нормального просмотра всеми пользователями должны предложить скачать и установить шрифт Arial Unicode MS. Тут возникает существенная проблема – шрифт «весит» более 22 мегабайт, и скачать его диалапщикам будет проблематично. Из этой непростой ситуации есть очень изящный выход. Можно создать «облегченный» шрифт. Для этого воспользуемся программой просмотра и редактирования шрифтов. Вообще их много разных, мы рекомендуем самую простую и удобную в работе программу FontLab. Скачать ее можно с сайта с таким же названием http://fontlab.com Открываем в программе наш Arial Unicode MS и удаляем из него тысячи ненужных нам символов, например, все иероглифы японские, корейские, китайские, вьетнамские и еще множество символов, которые заведомо нам не пригодятся. Облегченный шрифт «весит» около 140 килобайт, его смело можно предложить скачать посетителям вашей странички.

Разбираясь с этой замечательной программой, вы обнаружите, что она позволяет редактировать символы и даже создавать свои новые. Символы семейства TrueType, как известно, построены векторами, соединяющими узловые точки. Перемещая эти узловые точки, можно получать самые замысловатые символы и фигурки, стоит поиграть с этим чудом. Пока для забавы, а потом обязательно найдется применение в серьезном проекте.

В заключение можно привести популярные, но довольно спорные, порой спекулятивные, на уровне сплетен, рассуждения на тему: почему же все-таки не возник единый международный стандарт? Такой, в таблице символов которого были бы последовательно занесены символы всех существующих естественных языков (по данным японских ученых, символы всех известных языков мира, как используемых сейчас, так и ныне «мертвых», можно уместить в таблицу символов, насчитывающую 224 = 16777216 позиций), притом одинаково удобный для применения во всех странах мира? Почему, напротив, в качестве международных принимались и принимаются заведомо несовершенные стандарты, часто недоработанные, и появилось большое количество несовместимых таблиц символов?
корпорациям-производителям ПО, очевидно, весьма выгодно продавать разные «национальные» версии операционных систем, офисных пакетов и так далее за отдельные деньги. Так, Microsoft продавала «американскую», «панъевропейскую», «восточноазиатскую», «ближневосточную» и «тайскую» версии Windows 95, а IBM — стандартную, «арабскую», «израильскую», «японскую», «корейскую», «китайскую» и «тайваньскую» версии PC DOS. Отсюда возникновение несовместимых таблиц символов, содержащих 256 позиций каждая поскольку «проблема кодировок» теперь не касается английского языка, у ANSI и правительства США не было повода вмешиваться в ее решение, как это было в 1963-м. Более того, «проблема кодировок», не касающаяся английского языка, стратегически выгодна для США. Она обеспечивает лидерство США и его крупнейшего англоязычного партнера по НАТО — Великобритании (и Австралии) — в сфере ИТ, и отставание других стран, так как «проблема кодировок» препятствует информационному обмену между людьми, работающими с данными не на английском языке.

Так ли все это, решайте сами, для нас же важно скорейшее внедрение кодировки Юникода.

Подключаем узбекский язык

Мало кто знает, что Windows XP поддерживает символы узбекского языка как кириллицу, так и латиницу. Если выберете кириллицу, то можно будет вставлять буквы с элементами – қ, ў, ғ, ҳ нажимая на клавиши ы, щ, -, = соответственно. Это значительно облегчает работу при наборе документов — не надо устанавливать специальные шрифты и вводить буквы с элементами как спецсимволы.

pic
pic

Дополнительные материалы:

http://www.unicode.org/standard/WhatIsUnicode.html — официальная страница Консорциума
http://consumer.nm.ru – статья про кодировки, в которой есть дальнейшие ссылки по теме.

Orphus system