Скидки до 60% и 3 курса в подарок 0 дней 00 :00 :00 Выбрать курс
Код
#статьи

Что такое ASCII: полное руководство для начинающих

Рассказываем про дедушку всех кодировок текста.

Иллюстрация: Оля Ежак для Skillbox Media

Люди привыкли общаться словами, составленными из букв, а компьютеры понимают только последовательности нулей и единиц. Но к счастью, нам не приходится вводить команды в виде бинарного кода. Это стало возможным благодаря системам кодировки, которые сопоставляют символы — буквы, цифры, знаки препинания — с двоичными комбинациями. Одной из первых таких универсальных систем стала ASCII. В статье расскажем, как она устроена и где применяется.

Содержание


Что такое таблица ASCII

ASCII (от англ. American Standard Code for Information Interchange) — стандарт представления текстовых символов в цифровом виде. Он появился в США в 1960-х, когда инженерам нужно было научиться передавать текст между устройствами, которые понимали только нули и единицы.

Идея была простой: каждому символу — своё число. Буквы латинского алфавита, цифры, знаки препинания и даже управляющие символы вроде перевода строки (\n) или табуляции (\t) получили уникальные числовые коды от 0 до 127.

Так выглядит классическая таблица ASCII:

Таблица символов ASCII
Изображение: wukong / Wikimedia Commons

ASCII стала универсальным «переводчиком» между человеком и машиной. Одни и те же байты означали одни и те же символы на любой платформе, что позволяло компьютерам считывать и выводить текст без системных ошибок. Со временем стандарт закрепился в протоколах и форматах, а в современной кодировке UTF-8 первые 128 символов полностью совпадают с ASCII.

Как создавалась ASCII

В начале 1960-х каждая компания, выпускавшая телетайпы, компьютеры или коммуникационное оборудование, использовала собственные таблицы кодов. Один и тот же символ мог обозначаться по-разному: например, буква A на одной машине имела код 41, а на другой — 91. Из-за этого при обмене данными устройства буквально «разговаривали» на разных языках.

Чтобы устранить хаос, Американский национальный институт стандартов (ANSI) создал рабочую группу во главе с инженером Бобом Бемером. Задачей команды было разработать единый набор символов, который понимали бы все устройства.

Новый стандарт должен был отвечать трём условиям:

  • быть компактным, чтобы данные легко передавались по каналам связи;
  • включать буквы, цифры, знаки препинания и управляющие коды;
  • оставаться совместимым с телетайпами и терминалами.

Рабочая группа собирала предложения от производителей телетайпов и компьютеров, телекоммуникационных компаний и даже правительственных структур. В итоге инженеры остановились на 7-битной кодировке, которая позволяла закодировать 128 символов.

В других вопросах инженеры не сразу сошлись во мнениях. Одни предлагали расположить строчные и заглавные буквы рядом, другие настаивали, что первые коды должны быть зарезервированы за управляющими символами. Обсуждали даже порядок алфавита и необходимость включения некоторых «редких» знаков.

Особо примечательным оказалось предложение Бобa Бемера добавить escape-символ (ESC). Изначально его сочли странным, но со временем ESC стал одним из ключевых элементов: он позволял терминалам отличать текст от команд, очищать экран, перемещать курсор и менять формат вывода.

Первая версия таблицы вышла в 1963 году под названием ANSI X3.4. В 1967–1968 годах её доработали, уточнив порядок символов и поведение некоторых кодов. После этого ASCII быстро вышел за пределы США и превратился в мировой стандарт. Его стали использовать в протоколах связи, операционных системах, компиляторах и языках программирования.

Структура и код ASCII

Таблица ASCII выглядит очень просто. В ней всего 128 символов, каждому из которых соответствует уникальное число от 0 до 127. Но за этой простотой стоит продуманная инженерная логика.

Каждому символу в таблице отводится ровно 7 бит. Это не случайное число, а строго рассчитанное: именно столько комбинаций (от 0000000 до 1111111) нужно, чтобы закодировать 128 значений.

В 1960-е годы инженеры старались экономить каждый бит. Уже появлялись 8-битные системы, но разработчики ASCII сознательно оставили один бит «свободным». В то время его часто использовали для проверки чётности или других служебных функций.

Давай те детально рассмотрим, какие символы есть в ASCII-таблице и в каком порядке они идут.

Управляющие символы (коды 0–31 и 127)

Коды от 0 до 31 и 127 зарезервированы под непечатные символы. Их нельзя увидеть на экране, но они выполняют команды для устройств ввода-вывода или форматирования текста. Большинство таких кодов пришло из эпохи телетайпов — например, «возврат каретки» действительно возвращал печатающую головку в начало строки.

Примеры управляющих символов:

  • 0 — NUL, «пустой символ», чаще всего обозначает конец строки.
  • 10 — LF, перевод строки.
  • 13 — CR, возврат каретки.
  • 27 — ESC, escape-символ, применяется для управляющих последовательностей в терминалах.
  • 127 — DEL, символ удаления.

Сегодня они редко используются напрямую, но всё ещё встречаются в протоколах, терминальных интерфейсах и форматах передачи данных.

Печатаемые символы (коды 32–126)

Начиная с кода 32, в таблице идут печатаемые символы — те, что можно увидеть в тексте. Они расположены логично и группами:

ДиапазонСимволы
32Пробел (space)
33-47Знаки препинания и спецсимволы: ! " # $ % & ’  ( ) * + , - . /
48-57Цифры: 09
58-64Спецсимволы: : ; < = > ? @
65-90Заглавные латинские буквы: AZ
91-96Скобки и акценты: ` [ \ ] ^ _ ``
97-122Строчные латинские буквы: az
123-126Дополнительные символы: { | } ~

Благодаря последовательному расположению букв алфавита их удобно обрабатывать в коде. Например, вывести английский алфавит в Python можно всего одним циклом for:

for code in range(65, 91):  # A-Z
    print(chr(code), end=' ')  # → A B C ... Z

Разница между заглавной и строчной буквой — ровно 32. Так, код заглавной буквы A равен 65, а чтобы узнать номер строчной, надо к 65 прибавить 32: 65 + 32 = 97. Это свойство можно использовать в коде для быстрой смены регистра символов.

Расширенная таблица ASCII

Базовый ASCII включает лишь 128 символов: латинский алфавит, арабские цифры, знаки препинания и управляющие коды. Для английского этого хватало, но для большинства европейских и тем более нелатинских языков — уже нет.

Чтобы восполнить пробелы, разработчики начали использовать восьмой бит, который изначально не задействовали. Так появились расширенные таблицы: диапазон 0–127 повторял классический ASCII, а коды 128–255 отводились под новые символы.

Ниже список популярных расширений ASCII:

  • Windows-1251 — набор кириллических символов в Windows. Его использовали до появления UTF-8.
  • ISO 8859-1 (Latin-1) — расширение для французского, польского, немецкого, испанского и других языков, использующих латиницу.
  • ISO 8859-2 (Latin-2) — набор для польского, чешского, хорватского и других центральноевропейских языков.
  • Windows-1252 (или ANSI Latin 1) — расширение, построенное на базе ISO 8859-1, но с добавлением специальных символов , . Его использовали в англоязычной версии Windows.
  • CP437 — кодировка MS-DOS, которая содержит английские символы и псевдографику: рамки, уголки, блоки, стрелки. Раньше этот стандарт использовали для создания интерфейсов в DOS-программах.
  • CP866 — кириллическая версия CP437.

В чём проблема

Расширенные таблицы решили вопрос нехватки символов, но породили новую проблему — несовместимость кодировок.

Если вы пользовались компьютером лет 10–15 назад, то наверняка сталкивались с «кракозябрами» вместо текста. Это происходило, когда файл создавался в одной кодировке, а открывался в другой: нумерация символов в таблицах не совпадала.

Именно эту проблему окончательно решил стандарт Unicode, который стал универсальной кодировкой для всех языков и символов.

Unicode и UTF-8: как компьютеры научились понимать все языки мира

В 1990-х, чтобы решить проблему множества несовместимых кодировок, инженеры придумали стандарт Unicode. Он присваивает каждому символу уникальный номер независимо от языка и платформы.

Сегодня в Unicode более 150 тысяч символов: буквы всех языков мира, эмодзи, символы валют, математические знаки и даже символы древних письменностей. Номер каждого символа состоит из префикса U+ и числа в шестнадцатеричном формате:

  • AU+0041;
  • аU+0430;
  • U+20AC;
  •  → U+1F604.

Однако Unicode лишь описывает символы и их номера, но не определяет способ хранения в памяти. Для этого существуют форматы кодирования: UTF-8, UTF-16 и UTF-32. Сегодня почти все сайты и приложения используют UTF-8.

Сам формат в 1992 году предложили разработчики Кен Томпсон и Роб Пайк. Для каждого Unicode-символа в UTF-8 выделяется от 1 до 4 байтов. Например, для латиницы и цифр достаточно одного байта, так как номера этих символов совпадают с ASCII, а для современных эмодзи требуется уже 4 байта:

  • A01000001 (1 байт)
  • 11100010 10000010 10101100 (3 байта)
  • 11110000 10011111 10011000 10000000 (4 байта)

Благодаря UTF-8 компьютеры смогли корректно отображать все символы мира — от латиницы до современных эмодзи.

Как узнать код символа или получить символ по коду

Иногда при отладке полезно заглянуть «под капот» текста и узнать, какой код у символа, во что он превращается в байтах и как из числа снова получить букву. Для этого есть несколько приёмов.

Ручная проверка

Если нужный символ находится в диапазоне от 0 до 127, то можно просто заглянуть в ASCII-таблицу. Базовая таблица есть даже в этой статье, а расширенную можно найти на портале ASCII Code.

Windows

В Windows есть платформа PowerShell, которая умеет напрямую конвертировать символы и коды:

# Узнать код символа (Unicode code point)
[int][char]'A'      # 65
[int][char]'€'      # 8364

# Узнать символ по коду (code point)
[char]65            # 'A'
[char]0x20AC        # '€'

В Linux или macOS

В Unix-подобных системах, таких как Linux и macOS, тоже есть стандартные утилиты для работы с кодировками:

  • Узнать байты символа можно с помощью echo. В ответ система выведет шестнадцатеричный ASCII-код:
echo -n "A" | xxd -p     # 41
echo -n "€" | xxd -p     # e282ac
  • Символ по коду можно вывести в терминал с помощью printf:
printf '\x41\n'          # A
printf '\xE2\x82\xAC\n'  # €
  • Десятичный код символа также можно узнать с помощью printf:
printf '%d\n' "'A"       # 65

Как набрать символ по его ASCII-коду

Иногда нужно ввести символ, которого нет на клавиатуре: знак копирайта, греческую букву, валюту или спецсимвол. В Windows для этого есть система Alt-кодов — способ ввода символов по их числовому коду.

Как использовать Alt-код:

  • Убедитесь, что включена функция Num Lock. Если включена, то на клавиатуре должен гореть светодиод Num.
  • Зажмите клавишу Alt.
  • На цифровой клавиатуре (справа) введите код символа.
  • Отпустите Alt — символ появится.

Alt-коды от 0 до 127 — это классический набор ASCII, коды от 128 до 255 — расширенная таблица, включающая символы с диакритиками, графику, валюты:

  • A — Alt + 65;
  • © — Alt + 0169;
  • ±Alt + 0177;
  • Alt + 0153;
  • ø — Alt + 0248.

В Windows есть и другие способы ввода нестандартных символов:

  • Таблица символов. Нажмите Win + R, введите charmapEnter. Откроется таблица символов: можно выбрать нужный, скопировать и вставить его в текст.
  • Меню эмодзи и спецсимволов. нажмите Win + . (точка). Появится встроенное меню с эмодзи, символами валют и математическими знаками.

Как использовать ASCII в программировании

Даже после появления Unicode таблица ASCII остаётся важным инструментом для обработки текста с помощью кода. С её помощью можно:

  • искать фрагменты текста, сортировать и фильтровать символы;
  • парсить данные, форматировать данные и разбирать протоколы;
  • шифровать информацию и работать с ней на бинарном уровне;
  • реализовывать символьные операции — например, преобразовывать строки и менять регистр.

Почти во всех языках программирования есть встроенные функции для получения ASCII-кода символа и обратного преобразования. Рассмотрим на примере Python:

  • Базовые операции для получения кода символа и символа по коду:
printf '%d\n' "'A"       # 65
  • Преобразование строки в список кодов и обратно:
text = "I like ASCII"

# Строка -> список ASCII-кодов
codes = [ord(c) for c in text]
print(codes)
# [73, 32, 108, 105, 107, 101, 32, 65, 83, 67, 73, 73]

# Список кодов -> строка
restored = ''.join(chr(c) for c in codes)
print(restored)
# "I like ASCII"
  • Сортировка строк по ASCII-кодам:
s = "I like ASCII"
sorted_s = ''.join(sorted(s))
print(sorted_s)
# "  ACIIISeikl"

Самое важное

  • ASCII — это стандарт для цифрового представления текстовых символов. С его помощью компьютеры кодируют буквы, цифры, знаки препинания и управляющие символы.
  • Первая версия ASCII появилась в 1963 году и включала всего 128 символов. Она стала универсальным «языком» для обмена текстом между устройствами.
  • Со временем стандарт вырос в Unicode, который охватывает более 150 тысяч символов: буквы всех языков мира, эмодзи, символы валют, математические и древние знаки.
  • ASCII и Unicode используются для обработки текста, передачи данных и шифрования. Например, на основе таблицы ASCII легко написать алгоритм для перевода строчных букв в прописные и обратно или реализовать другие операции с символами.
  • Стандарты кодирования, такие как UTF-8, позволяют корректно хранить и передавать все символы Unicode в памяти компьютера и по сети.

Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!



Изучайте IT на практике — бесплатно

Курсы за 2990 0 р.

Я не знаю, с чего начать
Курс с трудоустройством: «Профессия Разработчик» Узнать о курсе
Понравилась статья?
Да

Пользуясь нашим сайтом, вы соглашаетесь с тем, что мы используем cookies 🍪

Ссылка скопирована