Введение

Использование чисел для представления текстовых символов

Кодировка символов — это процесс присвоения чисел графическим символам, в особенности письменным символам человеческого языка, что позволяет хранить, передавать и преобразовывать их с помощью цифровых компьютеров. Числовые значения, составляющие кодировку символов, известны как "кодовые точки" и в совокупности образуют "кодовое пространство", "страницу кодов" или "карту символов". Ранние коды символов, связанные с оптическим или электрическим телеграфом, могли представлять лишь подмножество символов, используемых в письменных языках, иногда ограничиваясь только прописными буквами, цифрами и некоторыми знаками препинания. Низкая стоимость цифрового представления данных в современных компьютерных системах позволяет использовать более сложные кодировки символов (например, Unicode), представляющие большинство символов, используемых во многих письменных языках. Кодировка символов, использующая международно признанные стандарты, обеспечивает глобальный обмен текстом в электронном виде.

История

История кодов символов иллюстрирует растущую потребность в символической информации, основанной на символах, передаваемой посредством машин на расстоянии, с использованием некогда новых электрических средств. Самые ранние коды основывались на ручном и рукописном кодировании и шифровании, таких как шифр Бэкона, шрифт Брайля, международные морские сигнальные флаги и 4-значное кодирование китайских символов для китайского телеграфного кода (Hans Schjellerup, 1869). С принятием электрических и электромеханических методов эти самые ранние коды были адаптированы к новым возможностям и ограничениям ранних машин. Самый ранний известный электрически передаваемый код символов, код Морзе, введенный в 1840-х годах, использовал систему из четырех "символов" (короткий сигнал, длинный сигнал, короткая пауза, длинная пауза) для генерации кодов переменной длины. Хотя некоторые коммерческие применения кода Морзе осуществлялись с помощью машин, он часто использовался как ручной код, генерируемый вручную на телеграфном ключе и расшифровываемый на слух, и сохраняется в любительском радио и авиационном использовании. Большинство кодов имеют фиксированную длину на символ или последовательности кодов переменной длины (например, Unicode). Распространенными примерами систем кодирования символов являются код Морзе, код Бодо, Американский стандартный код для обмена информацией (ASCII) и Unicode. Юникод, хорошо определенная и расширяемая система кодирования, заменила большинство предыдущих кодировок символов, но путь развития кодов до настоящего времени достаточно хорошо известен. Код Бодо, пятибитное кодирование, был создан Эмилем Бодо в 1870 году, запатентован в 1874 году, модифицирован Дональдом Мюрреем в 1901 году и стандартизирован CCITT как Международный телеграфный алфавит № 2 (ITA2) в 1930 году. Название "Бодо" ошибочно применялось к ITA2 и его многочисленным вариантам. ITA2 имел много недостатков и часто улучшался многими производителями оборудования, иногда создавая проблемы совместимости. В 1959 году военные США определили свой код Fieldata, шести- или семибитный код, введенный Сигнальным корпусом армии США. Хотя Fieldata решала многие современные проблемы (например, буквенные и цифровые коды, упорядоченные для машинной сортировки), она не достигла своих целей и была недолговечной. В 1963 году был выпущен первый код ASCII (X3.4 1963) комитетом ASCII (в котором был по крайней мере один член комитета Fieldata, В. Ф. Лёбберт), который устранил большинство недостатков Fieldata, используя более простой код. Многие из изменений были незначительными, например, сопоставимые наборы символов в определенных числовых диапазонах. ASCII63 был успешным, широко принятым в промышленности, и с последующим выпуском кода ASCII 1967 года (который добавил строчные буквы и исправил некоторые проблемы с "управляющими кодами") ASCII67 был принят довольно широко. Американская направленность ASCII67 была в некоторой степени учтена в европейском стандарте ECMA 6. Герман Холлерит изобрел кодирование данных на перфокартах в конце 19-го века для анализа данных переписи. Первоначально каждое положение отверстия представляло собой отдельный элемент данных, но позже числовая информация кодировалась путем нумерации нижних строк от 0 до 9, при этом пробитие в столбце представляло его номер строки. Позже алфавитные данные кодировались, позволяя более одного пробития в столбце. Электромеханические табулирующие машины представляли дату внутренне по времени импульсов относительно движения карт через машину. Когда IBM перешла к электронной обработке, начиная с IBM 603 Electronic Multiplier, она использовала различные двоичные схемы кодирования, которые были связаны с кодом перфокарты. Binary Coded Decimal (BCD) от IBM — это шестибитная схема кодирования, используемая IBM еще в 1953 году в своих компьютерах 702 и 704, а также в более поздних сериях 7000 и 1400, а также в связанных с ними периферийных устройствах. Поскольку в то время использовался кодировщик для перфокарты, который допускал только цифры, прописные английские буквы и несколько специальных символов, шести бит было достаточно. BCD расширила существующее простое четырехбитное числовое кодирование, включив в него алфавитные и специальные символы, легко сопоставляя его с кодированием перфокарты, которое уже было широко распространено. Коды IBM использовались в основном с оборудованием IBM; другие поставщики компьютеров той эпохи имели свои собственные символьные коды, часто шестибитные, но обычно имели возможность читать ленты, произведенные на оборудовании IBM. BCD была предшественницей Extended Binary Coded Decimal Interchange Code (обычно сокращенно EBCDIC) от IBM, восьмибитной схемы кодирования, разработанной в 1963 году для IBM System/360, которая отличалась более широким набором символов, включая строчные буквы. В попытке разработать универсально взаимозаменяемые кодировки символов исследователи в 1980-х годах столкнулись с дилеммой: с одной стороны, казалось необходимым добавлять больше бит для размещения дополнительных символов, а с другой стороны, для пользователей относительно небольшого набора символов латинского алфавита (которые все еще составляли большинство пользователей компьютеров) эти дополнительные биты были колоссальной тратой тогдашних дефицитных и дорогих вычислительных ресурсов (поскольку они всегда обнулялись для таких пользователей). В 1985 году жесткий диск среднего персонального компьютера мог хранить всего около 10 мегабайт и стоил примерно 250 долларов США на оптовом рынке (и гораздо дороже при покупке отдельно в розницу), поэтому в то время было очень важно использовать каждый бит с пользой. Компромиссным решением, которое в конечном итоге было найдено, было отказ от предположения (уходящего корнями в телеграфные коды), что каждый символ всегда должен напрямую соответствовать определенной последовательности битов. Вместо этого символы сначала отображались бы в универсальное промежуточное представление в виде абстрактных чисел, называемых кодовыми точками. Кодовые точки затем представлялись бы различными способами и с различным количеством битов на символ (кодовых единиц) по умолчанию в зависимости от контекста. Для кодирования кодовых точек, превышающих длину кодовой единицы, например, выше 256 для восьмибитных единиц, решением было внедрение кодировок переменной длины, где управляющая последовательность сигнализировала бы о том, что последующие биты следует анализировать как кодовую точку более высокого порядка.

Терминология

Неформально термины "кодировка символов", "карта символов", "набор символов" и "страница кодов" часто используются как взаимозаменяемые. Исторически один и тот же стандарт определял репертуар символов и способ их кодирования в поток кодовых единиц — обычно по одному символу на кодовую единицу. Однако, с появлением более сложных кодировок символов, различие между этими терминами стало существенным. Символ — это минимальная единица текста, имеющая семантическое значение. Набор символов — это совокупность элементов, используемых для представления текста. Репертуар может быть закрытым, то есть не допускающим добавлений без создания нового стандарта (как в случае с ASCII и большинством серий ISO 8859), или открытым, допускающим добавления (как в случае с Unicode и, в ограниченной степени, страницами кодов Windows). Другие поставщики, включая Microsoft, SAP и Oracle Corporation, также публиковали собственные наборы страниц кодов; наиболее известными являются наборы "Windows" (на основе Windows 1252) и "IBM"/"DOS" (на основе страницы кодов 437). Несмотря на то, что стандарты больше не ссылаются на конкретные номера страниц, многие кодировки символов по-прежнему называют по номеру страницы кодов; равно как и термин "страница кодов" часто используется для обозначения кодировок символов в целом. Термин "страница кодов" не используется в Unix или Linux, где предпочтительнее "charmap", обычно в контексте локалей. Архитектура представления символьных данных (CDRA) IBM обозначает сущности кодированными идентификаторами наборов символов (CCSID), каждый из которых может называться "charset", "набор символов", "страница кодов" или "CHARMAP".

Персонажи

То, что именно составляет символ, варьируется в зависимости от кодировки символов. Например, для букв с диакритическими знаками существует два различных подхода к их кодированию: их можно кодировать либо как единый унифицированный символ (известный как предварительно скомпонованный символ), либо как отдельные символы, которые объединяются в один глиф. Первый подход упрощает систему обработки текста, а второй позволяет использовать любую комбинацию буквы и диакритического знака в тексте. Лигатуры создают схожие проблемы. Точный способ обработки вариантов глифов – это выбор, который необходимо сделать при создании конкретной кодировки символов. Некоторые системы письма, такие как арабская и еврейская, должны учитывать такие особенности, как графемы, которые соединяются по-разному в зависимости от контекста, но при этом представляют один и тот же семантический символ.