Представление символьных и строковых данных. Принципы построения кодовых таблиц ASCII, КОИ-8, ISO8859-5, Windows-1251, UTF-8, UTF-16

Представление символьных и строковых данных

В вычислительных системах символы не могут храниться в графическом виде. Вместо этого используется кодирование: каждому символу ставится в соответствие уникальное число (код).

Строки в памяти представляют собой массивы (последовательности) байтов или машинных слов, где каждый элемент — код отдельного символа. Существует два основных способа хранения строк: с терминальным символом (Null-terminated, C-strings), когда в конце строки ставится специальный стоп-символ (обычно нулевой байт \0), и с префиксом длины (Pascal-strings), когда перед самой строкой в памяти хранится число, указывающее количество символов в ней. В БЭВМ массив символов занимает по одному байту (максимально 2 символа в 16-битном слове).

Исторические стандарты и однобайтовые кодировки

  1. ASCII (American Standard Code for Information Interchange) Базовый 7-битный стандарт кодирования, описывающий 128 символов. Коды 0–31 отведены под управляющие символы (перевод строки, табуляция, возврат каретки), которые предназначались для управления принтерами и телетайпами. Коды 32–127 — печатные символы: латинский алфавит, цифры и знаки препинания. Восьмой бит изначально использовался для контроля четности (проверки ошибок), но с развитием ЭВМ стал применяться для расширения таблицы до 256 символов.

  2. КОИ-8 (Код обмена информацией) Восьмибитная кодировка, созданная для кириллицы. Ее главная особенность — кириллические буквы расположены в верхней половине таблицы так, что отбрасывание 8-го бита дает фонетически эквивалентный латинский символ (А -> A, Б -> B, Ц -> C). Из-за этого текст оставался читаемым в виде транслита при передаче через 7-битный канал, однако буквы кириллицы расположены не в строгом алфавитном порядке.

  3. ISO 8859-5 Попытка создать единый международный стандарт 8-битной кодировки для кириллицы (включая сербский, болгарский и македонский языки). Кириллица здесь расположена строго по алфавиту в верхней половине таблицы. Существенным недостатком стало отсутствие важных символов псевдографики и специфических типографских знаков, из-за чего стандарт почти не использовался в России.

  4. Windows-1251 Стандартная 8-битная кодировка, созданная Microsoft для русскоязычных версий ОС Windows. Русские буквы расположены в строгом алфавитном порядке (кроме буквы «Ё»). В таблице присутствуют почти все нужные типографские знаки, однако полностью отсутствуют символы псевдографики (рамки), что раньше сильно затрудняло оформление интерфейсов в консоли.

Семейство Unicode

С глобализацией интернета 8-битных кодировок (максимум 256 символов) стало критически не хватать, так как они не позволяли смешивать в одном документе разные алфавиты. Решением стал стандарт Unicode — единое адресное пространство, где каждому символу в мире присвоен уникальный номер (Code Point).

  1. UTF-8 (Unicode Transformation Format - 8-bit) Самая популярная кодировка в интернете. Символы кодируются переменным числом байт (от 1 до 6, но на практике стандартизировано до 4). Коды от U+0000 до U+007F занимают 1 байт и побитово полностью совпадают с ASCII. Остальные символы (включая кириллицу) занимают от 2 до 4 байт. Старшие биты первого байта указывают длину последовательности (например, 110xxxxx — 2 байта), а последующие байты всегда начинаются с префикса 10xxxxxx. Это обеспечивает абсолютную обратную совместимость с ASCII-системами. Пример:

  2. UTF-16 Символы кодируются последовательностями из 16-битных слов. Большинство базовых символов мировых алфавитов кодируются ровно в 2 байта. Редкие символы (например, исторические иероглифы, новые эмодзи) выходят за пределы 16 бит и кодируются “суррогатными парами” — двумя 16-битными словами (итого 4 байта). Формат требует обязательного учета порядка байтов (Big-Endian или Little-Endian).