ASCII и Unicode: что это и для чего нужны

Компьютер понимает только числа, поэтому каждая буква на экране — это код. ASCII стала первой таблицей кодов, ставшей стандартом, а Unicode — та, которой мы пользуемся сегодня, чтобы писать на любом языке. Здесь вы увидите, как они устроены, какие коды стоит знать, почему вместо русских букв иногда появляются странные символы и как свериться с таблицей.

Обновлено:

Что такое кодировка символов

Кодировка — это договорённость: «число 65 означает букву A». Когда вы пишете текст, программа сохраняет эти числа; когда другой человек открывает его, его программа снова переводит их в буквы по той же договорённости. Если у двух сторон разные таблицы, текст получается неправильным.

Нужно различать две идеи. Одна — набор символов, то есть список, какие числа каким символам соответствуют. Другая — как эти числа хранятся в байтах. В ASCII они совпадают тривиальным образом; в Unicode — нет, и тут появляется UTF-8.

ASCII: 128 символов из 7 бит

ASCII (сокращение от American Standard Code for Information Interchange) был стандартизован в 1960-х годах. Он использует 7 бит, то есть 2 в степени 7 = 128 кодов, от 0 до 127. Из них 33 — управляющие символы (с 0 по 31 и 127), а 95 — печатные (с 32 по 126, включая пробел).

В нём нет ни кириллицы, ни букв с диакритикой, ни знака евро: он создавался для английского языка. Это объясняет, почему позже понадобились другие таблицы.

Коды, которые встречаются чаще всего. Пробел (32) считается печатным, хотя его не видно.
Управляющий символДесятичныйШестнадцатеричныйДвоичный (7 бит)Для чего нужен
Нулевой (NUL)0000000000Отмечает конец строки во многих языках
Горизонтальная табуляция (TAB)9090001001Переходит к следующей позиции табуляции
Перевод строки (LF)100A0001010Опускается на следующую строку
Возврат каретки (CR)130D0001101Возвращается в начало строки
Escape (ESC)271B0011011Начинает управляющие последовательности
Пробел32200100000Первый печатный символ
Удаление (DEL)1277F1111111Стирает символ

Закономерности, которые стоит запомнить

Таблица упорядочена не случайно. Несколько закономерностей позволят читать коды по памяти.

Конец строки: LF, CR и CRLF

Перевод строки кажется простым, но в разных системах он записывается по-разному. Unix, Linux и macOS используют один символ, LF (10). Windows использует два подряд, CR и LF (13 и 10), известные как CRLF. Старые телетайпы нуждались в двух разных командах: вернуть каретку в начало и прокрутить бумагу на одну строку.

Эта разница — причина того, что файлы в простом редакторе выглядят одной строкой или с лишним символом в конце каждой строки. Если вы хотите узнать, какой код у каждого символа, введите LF или CR в поле поиска таблицы ASCII.

«Расширенный ASCII» — не стандарт

Поскольку в байте 8 бит, а ASCII использует только 7, оставалось 128 свободных кодов (с 128 по 255), и каждый производитель и регион заполнял их по-своему. Это называют «расширенным ASCII», но единой таблицы не существует: их много, и называются они кодовыми страницами. Для кириллицы использовали Windows-1251 (где «я» — это код 255), KOI8-R («я» — 209) и CP866 («я» — 239). Из западных самые известные — Latin-1 (ISO-8859-1), где é — это код 233, и Windows-1252, похожая, но с отличиями в кодах 128–159 (там, например, находится евро).

Проблема в том, что код 233 означает «é» в одной таблице и что-то другое в другой. Текст, записанный в одной таблице и прочитанный в другой, превращался в мусор. Unicode появился, чтобы покончить с этой неразберихой.

Unicode и UTF-8

Unicode присваивает уникальный номер, называемый кодовой точкой, каждому символу почти всех письменностей мира, а также символам и эмодзи. Сегодня в нём более 150 000 символов. Кодовая точка записывается с префиксом U+ и в шестнадцатеричной системе: «A» — это U+0041, «я» — U+044F, евро — U+20AC, а смайлик-улыбка — U+1F600. Первые 128 кодовых точек в точности совпадают с ASCII.

UTF-8 — самый распространённый способ хранить эти номера в байтах, он использует от 1 до 4 байт в зависимости от символа. 128 символов ASCII занимают один байт, такой же, как всегда, поэтому ASCII-текст — это одновременно и допустимый UTF-8-текст. Остальные занимают больше байт.

Чем дальше от ASCII, тем больше байт занимает символ.
СимволКодовая точкаБайт в UTF-8Байты (шестнадцатеричные)
AU+0041141
éU+00E92C3 A9
яU+044F2D1 8F
€U+20AC3E2 82 AC
😀U+1F6004F0 9F 98 80

Почему вместо «Привет» появляется «РџСЂРёРІРµС‚»

Это самая частая ошибка, и у неё есть точное объяснение. Буква «я» в UTF-8 — это два байта: D1 и 8F. Если программа считает, что текст в Windows-1251, она читает каждый байт как отдельный символ и получает пару совсем других букв. Так «Привет» превращается ⠫Привет», а «канал» — ⠫канал: каждая русская буква в UTF-8 занимает два байта, поэтому символов становится вдвое больше, и они выглядят как череда букв Р и С.

Решение почти всегда в том, чтобы указать программе открыть файл как UTF-8 (в текстовом редакторе или в настройках импорта электронной таблицы). Когда происходит наоборот, то есть текст в Windows-1251 читается как UTF-8, обычно появляются ромбики со знаком вопроса, потому что такие одиночные байты не образуют допустимых последовательностей UTF-8.

Как пользоваться таблицей ASCII и конвертером

Инструмент «Таблица ASCII» показывает 128 символов с их кодом в десятичной, шестнадцатеричной, восьмеричной и двоичной системах, а также названия управляющих символов.

  1. Введите в поле поиска символ, код или название управляющего символа (например, A, 65, 41 или LF), чтобы найти его строку.
  2. Используйте кнопки фильтра (Управляющие, Цифры, Заглавные, Строчные, Знаки), чтобы показать только одну группу.
  3. Для перевода введите текст в поле «Текст» и выберите формат (десятичный, шестнадцатеричный, восьмеричный или двоичный): ниже появятся коды. «Hola» даёт 72 111 108 97 в десятичной и 48 6F 6C 61 в шестнадцатеричной записи.
  4. Можно и наоборот: вставьте коды через пробелы или запятые в поле «Коды», и соберётся текст. В шестнадцатеричной записи допускаются префиксы вроде 0x41.

Если в тексте есть не ASCII-символы, например русские буквы, инструмент предупредит об этом и покажет их код Unicode. Чтобы увидеть настоящие байты в UTF-8, используйте «Текст в двоичный код»: «я» даёт 11010001 10001111, два байта по 8 бит. Ограничения: таблица показывает только стандартный ASCII, без расширенного, а всё вычисляется в вашем браузере без отправки текста на какой-либо сервер.

Частые вопросы

Сколько символов в ASCII?

128, с кодами от 0 до 127 и по 7 бит на каждый. Из них 33 управляющих и 95 печатных, считая пробел.

Какой ASCII-код у буквы A и у буквы a?

«A» — это 65 (41 в шестнадцатеричной, 01000001 в двоичной), а «a» — это 97 (61 в шестнадцатеричной, 01100001 в двоичной). Они всегда различаются на 32.

Чем отличаются ASCII и Unicode?

В ASCII 128 символов, рассчитанных на английский язык. В Unicode более 150 000 символов почти всех языков и эмодзи, а его первые 128 совпадают с ASCII.

Что такое UTF-8?

Это самый распространённый способ хранить текст Unicode в байтах. Он использует от 1 до 4 байт на символ: символы ASCII занимают один, русская буква два, а эмодзи четыре.

Почему в моём тексте вместо букв появляются «РџСЂРёРІРµС‚»?

Потому что текст, сохранённый в UTF-8, читается как Windows-1251. Откройте файл, указав кодировку UTF-8, и всё исправится.