Что такое кодировка символов
Кодировка — это договорённость: «число 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, включая пробел).
В нём нет ни кириллицы, ни букв с диакритикой, ни знака евро: он создавался для английского языка. Это объясняет, почему позже понадобились другие таблицы.
| Управляющий символ | Десятичный | Шестнадцатеричный | Двоичный (7 бит) | Для чего нужен |
|---|---|---|---|---|
| Нулевой (NUL) | 0 | 00 | 0000000 | Отмечает конец строки во многих языках |
| Горизонтальная табуляция (TAB) | 9 | 09 | 0001001 | Переходит к следующей позиции табуляции |
| Перевод строки (LF) | 10 | 0A | 0001010 | Опускается на следующую строку |
| Возврат каретки (CR) | 13 | 0D | 0001101 | Возвращается в начало строки |
| Escape (ESC) | 27 | 1B | 0011011 | Начинает управляющие последовательности |
| Пробел | 32 | 20 | 0100000 | Первый печатный символ |
| Удаление (DEL) | 127 | 7F | 1111111 | Стирает символ |
Закономерности, которые стоит запомнить
Таблица упорядочена не случайно. Несколько закономерностей позволят читать коды по памяти.
- Цифры от «0» до «9» занимают коды с 48 по 57 (от 30 до 39 в шестнадцатеричной записи). Значение цифры — это её код минус 48: «7» имеет код 55, а 55 − 48 = 7.
- Заглавные буквы идут с 65 («A») по 90 («Z»), а строчные — с 97 («a») по 122 («z»).
- Разница между заглавной буквой и её строчной всегда равна 32: «A» = 65 и «a» = 97; «C» = 67 и «c» = 99. В двоичной записи меняется только один бит: 01000001 для «A» и 01100001 для «a».
- Чтобы узнать, какое место в алфавите занимает заглавная буква, вычтите 64: «C» — это 67, а 67 − 64 = 3, третья буква.
- Поскольку у всех заглавных букв (65–90) коды меньше, чем у строчных (97–122), алфавитная сортировка «по коду» поставит «Zebra» перед «apple». Многим программам для правильной сортировки нужна отдельная настройка сравнения.
Конец строки: 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-текст. Остальные занимают больше байт.
| Символ | Кодовая точка | Байт в UTF-8 | Байты (шестнадцатеричные) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| я | U+044F | 2 | D1 8F |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
Почему вместо «Привет» появляется «РџСЂРёРІРµС‚»
Это самая частая ошибка, и у неё есть точное объяснение. Буква «я» в UTF-8 — это два байта: D1 и 8F. Если программа считает, что текст в Windows-1251, она читает каждый байт как отдельный символ и получает пару совсем других букв. Так «Привет» превращается ⠫Привет», а «канал» — ⠫канал: каждая русская буква в UTF-8 занимает два байта, поэтому символов становится вдвое больше, и они выглядят как череда букв Р и С.
Решение почти всегда в том, чтобы указать программе открыть файл как UTF-8 (в текстовом редакторе или в настройках импорта электронной таблицы). Когда происходит наоборот, то есть текст в Windows-1251 читается как UTF-8, обычно появляются ромбики со знаком вопроса, потому что такие одиночные байты не образуют допустимых последовательностей UTF-8.
Как пользоваться таблицей ASCII и конвертером
Инструмент «Таблица ASCII» показывает 128 символов с их кодом в десятичной, шестнадцатеричной, восьмеричной и двоичной системах, а также названия управляющих символов.
- Введите в поле поиска символ, код или название управляющего символа (например, A, 65, 41 или LF), чтобы найти его строку.
- Используйте кнопки фильтра (Управляющие, Цифры, Заглавные, Строчные, Знаки), чтобы показать только одну группу.
- Для перевода введите текст в поле «Текст» и выберите формат (десятичный, шестнадцатеричный, восьмеричный или двоичный): ниже появятся коды. «Hola» даёт 72 111 108 97 в десятичной и 48 6F 6C 61 в шестнадцатеричной записи.
- Можно и наоборот: вставьте коды через пробелы или запятые в поле «Коды», и соберётся текст. В шестнадцатеричной записи допускаются префиксы вроде 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, и всё исправится.