Почему в ASCII именно 128 символов?
Если вы когда-нибудь задавались вопросом, почему ASCII содержит именно 128 символов, ответ находится не в каком-то особом свойстве числа 128. Всё гораздо прозаичнее: классический ASCII - семибитный код, а семь бит позволяют получить 128 комбинаций. Но за этой простой арифметикой скрывается история стандарта, который появился в 1960-х годах и до сих пор заметен в каждом обычном тексте, который мы набираем на компьютере.
На первый взгляд ASCII сегодня выглядит довольно странно. Всего 128 значений, причём половина из них даже не предназначена для вывода обычных символов. Нет кириллицы, нет китайских иероглифов, нет большинства знаков, которыми мы спокойно пользуемся сейчас.
И всё же этот небольшой стандарт оказался удивительно живучим.
Семь бит вместо восьми
С математикой здесь действительно всё просто.
Один бит может иметь два состояния - 0 или 1. Два бита дают четыре комбинации, три - восемь. Если продолжать дальше, семь бит дают 128 вариантов:
2⁷ = 128
Поэтому значения ASCII находятся в диапазоне от 0 до 127.
Но назвать эти 128 значений «128 буквами и знаками» было бы неправильно. В таблице есть латинские буквы, цифры, знаки пунктуации, но также присутствуют управляющие символы.
Например, CR обозначает возврат каретки, а LF - перевод строки. Такие коды не должны были превращаться в нарисованные на экране значки. Они управляли обработкой текста и работой устройств.
Это важная особенность старых систем: текст для компьютера был не только последовательностью видимых букв. В нём могли находиться команды, которые говорили устройству, что делать дальше.
Зачем вообще понадобился ASCII
В начале 1960-х годов не существовало того единого текстового стандарта, к которому мы привыкли сейчас. Разные компьютеры, терминалы и системы связи могли использовать собственные способы представления символов.
Для человека буква оставалась буквой. Для машины всё зависело от числового кода, который ей соответствовал.
Если одна система считала определённое значение буквой A, а другая трактовала его иначе, нормального обмена данными не получалось.
Поэтому задача ASCII была довольно практической: создать стандартный набор кодов, который разные системы могли бы использовать одинаково.
И вот здесь стоит помнить одну вещь. ASCII не проектировали как универсальную систему записи всех языков мира.
Основой были латинские буквы, цифры, знаки пунктуации и управляющие символы. Для английского языка этого набора было вполне достаточно.
Для русского - уже нет.
Для китайского - тем более.
Но это не означало, что создатели стандарта забыли о существовании других языков. Просто ASCII решал конкретную задачу стандартизации обмена информацией, а не задачу представления всей письменности человечества.
Почему именно 128, а не 256
Вот здесь обычно и появляется вопрос про восьмой бит.
Если семь бит дают 128 значений, то восемь дали бы 256. Казалось бы, можно было сразу сделать таблицу побольше.
Однако сам ASCII был определён как 7-битный код. Именно в таком виде он был стандартизирован.
Это не означает, что восьмибитных компьютеров или способов передачи данных тогда не существовало. Речь именно о структуре ASCII.
В семи битах нужно было разместить весь предусмотренный стандартом набор - от управляющих кодов до печатных символов. Получившихся 128 значений для этой задачи было достаточно.
Поэтому вопрос «почему не 256?» немного обманчив.
Технически можно было создать другой код с 256 значениями. Но тогда это был бы уже другой стандарт, и пришлось бы заново решать, какие именно символы и управляющие функции должны получить свои числовые значения.
А стандартизация как раз и заключается в том, чтобы договориться об этих значениях.
Что происходило с восьмым битом
Здесь ASCII часто путают с байтом.
Сегодня байт почти всегда воспринимается как восемь бит. Поэтому легко решить, что ASCII - это восьмибитная кодировка, в которой просто «не использовали» один бит.
Исторически точнее говорить иначе.
ASCII был 7-битным кодом. В системах, где данные передавались восьмибитными единицами, этот код можно было поместить в байт. В RFC 20, например, ASCII описывается как 7-битный код внутри 8-битной единицы данных, причём старший бит установлен в ноль.
В некоторых системах дополнительный бит использовался для других целей, включая проверку чётности при передаче.
Поэтому восьмой бит не был каким-то скрытым дополнительным пространством ASCII.
Это был уже вопрос конкретной аппаратуры и способа передачи данных.
Потом понадобились другие алфавиты
С английским ASCII справлялся неплохо.
Но компьютеры быстро перестали быть исключительно англоязычными машинами.
Появилась необходимость работать с национальными алфавитами. Для кириллицы требовались одни символы, для других языков - другие.
Восьмибитный формат позволял добавить ещё 128 значений поверх первых 128 ASCII-значений. Так появились различные расширенные кодировки и кодовые страницы.
Проблема заключалась в том, что дополнительные значения не имели единого международного смысла.
Один и тот же байт в разных кодировках мог означать разные символы.
Отсюда знакомая ситуация со старыми текстовыми файлами: открываешь документ, а вместо нормального текста видишь набор странных знаков.
Сам ASCII при этом никуда не исчезал. Наоборот, диапазон от 0 до 127 часто сохраняли, потому что огромное количество программ уже рассчитывало именно на него.
Это было удобно для совместимости, но одновременно показывало предел старого подхода.
128 значений хватало для базового набора.
Для всех языков мира - уже совершенно нет.
Unicode не стал уничтожать ASCII
В какой-то момент стало очевидно, что бесконечно добавлять новые кодовые страницы - плохой способ решить проблему.
Нужна была система, способная представить гораздо большее количество символов.
Так появился Unicode.
Современный Unicode намного масштабнее ASCII, но интересная деталь заключается в том, что от старого стандарта никто не стал отказываться полностью.
UTF-8 сохраняет ASCII в своём нижнем диапазоне. Значения от 0 до 127 в UTF-8 представлены теми же байтовыми значениями, что и в ASCII.
Поэтому строка, состоящая только из ASCII-символов, одновременно является корректной строкой UTF-8.
Это одна из причин, почему переход к Unicode не потребовал выбросить огромное количество старого программного обеспечения и текстовых данных.
Старый фундамент просто оказался достаточно удобным, чтобы оставить его на месте.
Почему ASCII до сих пор встречается в коде
Сегодня никто не использует ASCII как полноценную систему для всех языков.
Если программе нужно нормально работать с русским, китайским, арабским или десятками других письменностей, обычно речь идёт уже об Unicode и конкретной форме его кодирования, например UTF-8.
Но ASCII продолжает существовать как базовый набор.
Достаточно посмотреть на обычный исходный код программы.
Английские буквы, цифры, скобки, кавычки, знаки операций и многие другие символы по-прежнему находятся в том самом диапазоне, который был определён десятилетия назад.
Например, заглавная A имеет значение 65, а символ 0 - 48.
Эти значения не стали другими только потому, что появились Unicode и UTF-8.
Новые стандарты построили гораздо более крупную систему, но сохранили совместимость с той её частью, которая уже была широко распространена.
Так откуда взялись эти 128?
Ответ действительно сводится к семи битам.
ASCII использует 7 бит, а семь бит дают 128 возможных комбинаций. Эти значения понадобились для набора печатных символов и управляющих кодов, которые составляли стандарт.
В то время этого было достаточно для поставленной задачи.
Позже оказалось, что компьютерный мир слишком велик для 128 значений. Появились расширенные кодировки, национальные кодовые страницы, а затем Unicode.
Но первые 128 значений никуда не делись.
И в этом, пожалуй, самая интересная часть истории ASCII. Он не оказался универсальным стандартом для человеческого текста - такой задачи он изначально и не решал. Зато его базовый набор оказался настолько распространённым, что более новые системы сохранили его внутри себя.
Сегодня мы можем написать текст на русском языке, добавить китайские иероглифы, математические символы и эмодзи, сохранить всё это в UTF-8 и совершенно не задумываться о старом семибитном стандарте.
А где-то внутри этой современной системы всё ещё живут те самые 128 значений.
Небольшой набор, рассчитанный на совсем другой компьютерный мир, оказался частью мира нынешнего.
Комментарии
Чтобы оставить комментарий, войдите в аккаунт.