ASCII и другие

В редакции КГ мне сообщили, что одна из наших постоянных читательниц попросила рассказать о различных кодировках символов. Что ж, извольте. Действительно, не много найдется в компьютерном деле вопросов таких же простых в теории и столь запутанных на практике. Речь, как обычно, пойдет преимущественно об IBM-совместимых персональных компьютерах.

(c) Компьютерная газета


Давно ли вы пытались дать определение понятию "буквы"? Я - совсем недавно: ребенок пошел в первый класс, начал постигать грамоту и ему потребовалась помощь. А теперь держитесь крепче. Буквы - это рисунки, изображения, которыми люди обозначают различные звуки. Одним словом, символы. Поскольку принцип записи звуков буквами давно нам привычен, а история алфавита насчитывает сотни лет, то мы редко задаемся вопросом, почему определенному звуку сопоставлен тот или иной символ.

А ребенок обязательно хочет узнать ответ. Мы-то понимаем, что выбор обозначений был практически произвольным. Единственное, что может сделать взрослый, отвечая на каверзный детский вопрос, - сослаться на традицию.

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

Как выбрать номера для тех или иных символов? Конечно, произвольно! Как больше понравится. История компьютеров насчитывает всего несколько десятков лет, и вы не ошибетесь, предположив, что общепринятый "компьютерный алфавит" еще не успел сложиться. Способов кодировки символов существует великое множество, а было еще больше. Каждый производитель компьютеров изобретал свою кодировку.

Если меня не подводит память, то для представления символов в самых первых компьютерах использовался стандартный телеграфный код. Логичный выбор, продиктованный тем обстоятельством, что для ввода и вывода текста использовались стандартные телетайпы, подключенные к ЭВМ. Когда появилось специализированное компьютерное оборудование ввода/вывода, изменилась и кодировка. Так, фирма IBM в своих больших машинах использовала кодировку EBCDIC (Extended Binary Coded Decimal Interchange Code) - расширенный двоично-десятичный код обмена информацией. Существовало по меньшей мере шесть версий EBCDIC, несовместимых между собой.

Конечно, необходимость стандартизации представления текстовой информации была скоро осознана. Результатом явилась кодировка ASCII (American Standard Code for Information Interchange) - стандартная американская кодировка для обмена информацией. Стандарт стандартом, а несовместимые или частично совместимые с ним варианты кодировок существовали и продолжают существовать.

Вы думаете, что это все? Как бы не так! Сущим проклятием кодировки стали для компьютерщиков тогда, когда компьютеры распространились за пределы англоязычных стран, а затем и стран с латинским алфавитом. Появилась проблема совмещения латинского и национального алфавита в одной кодировке. В чем состоит проблема? Очень просто: текст, который создан в одной кодировке, при использовании другой предстает набором символов, лишенных всякого смысла.

Вот вам пример: "последовательность" и "gjcktljdfntkmyjcnm". Я два раза набрал одно и то же слово, ударяя по одним и тем же клавишам, но намеренно "забыл" переключиться с английского языка на русский, то есть не переключил кодировку. Вот так же и с текстом в компьютере: одни и те же байты изображаются на экране или на печати разными символами, в зависимости от того, какую текущую кодировку "отрабатывает" компьютер.

Программисты постарше помнят машины линий СМ и ДВК (советские аналоги компьютеров американской фирмы DEC), в которых использовалась семибитовая кодировка KOI-7. Другими словами, с ее помощью можно было представить не более 128 символов, многие из которых нельзя было переопределить. В результате программист должен был выбирать один из трех вариантов одной и той же кодировки: А) латинский, со строчными и заглавными буквами, Б) кириллический, со строчными и заглавными буквами, или В) смешанный, с заглавными латинскими и русскими буквами.

Самое занятное, что для задания используемой кодировки нужно было щелкать тумблером... Ладно, не тумблером, - это я для красного словца, но переключение производилось аппаратно, а не программно. Когда кодировка, с использованием которой был набран текст, не совпадала с установленной в компьютере, экран монитора покрывался нечитабельным "мусором". Я уже не говорю о том, что непосредственный перенос текста с ДВК (KOI-7 в трех вариациях) на PC (ASCII) был невозможен без специальных средств преобразования кодов.

Что касается принятой для PC восьмибитовой (256 символов) кодировки ASCII, то и здесь поначалу применялось не менее трех вариантов расположения букв кириллицы. В конце концов выжил вариант, известный как CP866, - кодовая страница N№866 MS DOS. Время идет, появляются новые компьютеры, новые операционные системы... и новые кодировки. Так, для представления кириллицы в OS MS Windows используется уже CP1251 - кодировка, несовместимая с прежней кодировкой кириллицы в MS DOS.

Лет шесть тому назад появились версии UNIX для IBM-совместимых персональных компьютеров. До того момента UNIX развивался на компьютерах VAX и PDP фирмы DEC. "Перепрыгнув" на PC, UNIX принес с собой кодировку DEC KOI-8 и ее кириллический вариант KOI-8r, который, кстати, считается фактическим стандартом для передачи русскоязычной информации и ее представления в Internet.

Ну да ладно, Бог с ней, с кириллицей. У нас все более или менее утряслось. Если кто и столкнулся с настоящими трудностями в компьютерном представлении символов, так это страны с арабским языком и азиатские страны с иероглифической письменностью. Об этих проблемах я знаю слишком мало, чтобы о них рассказывать, - только то, что они до конца так еще и не разрешены.

Одним из возможных решений проблемы совместимости национальных кодировок символов является разработка универсального межнационального стандарта. На его роль в настоящее время претендует стандарт UNICODE, в котором для представления символов используется двухбайтовая кодировка. В OS Windows 95 и Windows NT уже есть средства по работе с UNICODE. Думаю, что вы, дочитав до этого места, не моргнув глазом примете известие, что кодировка символов кириллицы в UNICODE не совместима ни с одной кодировкой русских букв, из числа упоминавшихся выше...

Евгений Щербатюк


Компьютерная газета. Статья была опубликована в номере 47 за 1999 год в рубрике soft :: текст

©1997-2024 Компьютерная газета