Затем систему кодирования ASCII пересмотрели, и для кодирования каждого символа стали использовать не 7, а 8 бит (этот 8-й бит существовал и ранее, но использовался не для представления данных, а для осуществления контроля чётности). Заметим, что в тексте стандарта ASCII такое «расширение» никак не регламентировано. Это привело к многочисленным проблемам, так как существующее на тот момент ПО работало с ASCII в его оригинальном виде[3].
Объём таблицы символов возрос до 256 позиций. Это позволяло отказаться от использования управляющих последовательностей для обеспечения работы с некоторыми языками, символы которых можно было уместить в появившееся место[4]. ISO выпускает стандарты ISO 2022 и серию стандартов ISO 8859-X (X – цифра от 1 до 15), описывающие, как следует задействовать новую возможность.
Серия стандартов 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 серии 8859-X. В «национальных» версиях своего программного обеспечения они использовали расширенную до 8 бит систему кодирования ASCII и таблицы символов, содержащие 256 позиций; первые 128 символов в которых соответствовали стандартной 128-символьной таблице 7-битной системы ASCII (то есть вновь английский язык не затронут), а расположение символов национальных языков во второй половине таблицы не соответствовало расположению, определённому ISO в стандартах серии 8859-X[5].
Таким образом возникали ситуации, когда даже для одного и того же языка сосуществовали две, а то и большее количество таблиц символов, несовместимых между собой и без наличия дополнительной информации программно неразличимых.
Возьмём в качестве примера многострадальный русский язык. Для кодирования больших и малых букв русского алфавита используются следующие несовместимые или не полностью совместимые между собой таблицы (и это не полный список; см. http://czyborra.com/charsets/ http://czyborra.com/charsets/cyrillic.html#Unicode):
– ISO использует таблицу «Cyrillic», описанную в стандарте ISO 8859-5;
– корпорации IBM и Microsoft в своих ОС PC DOS и MS DOS использует таблицу CP866. CP866 – это один из представителей целой серии таблиц, используемых для «поддержки национальных языков» различными производителями DOS (CP437, CP850, CP852 и т.д., вплоть до CP874. Интересно, что ISO 8859-5 в этом наборе есть и упоминается как CP915). Очевидно, эта серия таблиц была составлена разработчиками и региональными продавцами компьютерной техники (Microsoft называет её «OEM charsets»), но из приведённых в документации ОС PC DOS 2000 ( (tm) of IBM Corp. ) данных ясно, что она как-то между прочим и фактически тайком была стандартизирована ISO – в документе ISO 9241-3, описывающем параметры мониторов[6] – «в дополнение» к уже определённой ранее серии стандартов 8859-X;
– корпорация 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 – только было уже поздно).
На практике в аппаратном обеспечении компьютерных систем[7] и в ОС для работы с текстами на разных языках использовались и по сей день используются 8-битная система кодирования символов вкупе с вышеописанными различными таблицами символов, объёмом в 256 позиций каждая. Однако американские компьютерные корпорации IBM и Xerox ещё в первой половине 1980-х начали работу над созданием новой «многоязычной» системы кодирования, в которой для представления символов используются двоичные последовательности длиною в 16 бит, а также единая большая таблица символов объёмом в 65536 позиций.
Впоследствии к этим корпорациям присоединились другие, и был начат проект, названный представителями американской компьютерной индустрии «Unification Code», или Unicode. Причём, дошло до того, что в 1991-м году эти корпорации (в их числе также Adobe, Microsoft и др.) для продвижения Unicode в качестве международного стандарта создали одноимённый транснациональный консорциум[8].
Главной задачей Unicode официально было объявлено сведение существующих в мире символов естественных языков в указанную большую таблицу и обеспечение одновременной и «равноправной» работы с ними. То есть, очевидно, когда количество недовольных «проблемой кодировок» пользователей превысило некоторую «критическую массу», указанные корпорации решили «обнародовать» систему Unicode и представить её как решение данной проблемы, делая намучившимся операторам ПК заманчивое, на первый взгляд, предложение – покупать поддерживающее её ПО.
Однако на самом деле и система Unicode является не окончательным решением проблемы кодирования символов, а лишь паллиативом. Дело в том, что метод кодирования, используемый в оригинальной версии Unicode, не предусматривал использования управляющих последовательностей для переключения между «базовой» и возможными «дополнительными» таблицами символов (как в ISO 646), поэтому максимальное количество символов, которые можно было представить, пользуясь Unicode, равнялось объёму одной-единственной («базовой») таблицы символов, используемой в этой системе – 65536.
А поскольку мы знаем, что в одном только японском языке используется около 65000 символов, можно понять заранее, что метод и таблица символов Unicode на самом деле малы для представления всех символов языков мира.
Таблица символов, используемая в Unicode, устроена следующим образом. Она разбита на 256 рядов. Первые ряды содержат некоторые из старых таблиц символов (объёмом в 128 или 256 позиций каждая) , определённых для некоторых языков. Самый первый ряд (под номером 0) представляет из себя таблицу ISO 8859-1 (в свою очередь, она содержит 128 символов из таблицы 7-битной системы ASCII, а также некоторые символы, используемые в языках стран Западной Европы).
[4]
Заметим, что свободных позиций там было не так уж и много, так как некоторые были уже зарезервированы за псевдографическими символами. Такие символы необходимы при работе в текстовом «режиме работы» (с позволения сказать – при ближайшем рассмотрении оказывается, что он неполноценен абсолютно в каждом из важнейших аспектов. Например, векторные по своей природе символы представляются там с помощью растровых шаблонов…), первоначально созданным корпорацией IBM в семействе своих видеокарт, применённом в компьютерах PC.
[5]
Кстати, некоторые из стандартов серии 8859-X, а именно – ISO 8859-1, ISO 8859-4, ISO 8859-6 – позднее, в 1998-м году, были пересмотрены самим ISO.
[6]
Также в этой связи там упоминается документ немецкого национального стандартизирующего института – DIN – за номером 66234. Между прочим, и DIN, и ANSI и ГОСТ Р являются членами ISO.
[7]
Имеются в виду, в первую очередь, BIOS материнских плат и видеокарт, в которых определяются начертания символов, используемых в «текстовом видеорежиме», а также матричные принтеры.