Структура ASCII
ASCII (1963, пересмотрен в 1967) — 7-битный код: 128 значений, из которых 33 — управляющие символы и 95 — печатные. Его раскладка проектировалась для механических телетайпов и железа, манипулирующего битами, и этот замысел виден до сих пор:
- Регистр — это один бит.
A— 0x41,a— 0x61: они различаются только битом 5 (значение 32).c | 0x20переводит букву в нижний регистр,c & ~0x20— в верхний, аc ^ 0x20переключает. - Цифры — это их значение плюс 48.
'7' - '0'равно 7, а младший полубайт кода цифры — сама цифра (0x37 → 7). - Ctrl сбрасывает два бита. Ctrl-C отправляет 0x03, потому что C — это 0x43, а терминал сбрасывает биты 6 и 5 (
c & 0x1F). Поэтому Ctrl-D — это EOT (4), Ctrl-H — забой (8), Ctrl-I — табуляция (9), Ctrl-M — возврат каретки (13), Ctrl-[ — Escape (27), а Ctrl-@ — NUL. - DEL — это 127, все семь битов установлены, потому что пробить все отверстия на бумажной ленте было способом удалить символ.
За пределами 127
«Расширенного ASCII» не существует. Байты 128–255 означали разные символы в каждой кодовой странице (Latin-1, Windows-1252, CP437, KOI8-R, ISO-8859-2 для сербской латиницы), что и порождает кракозябры вроде «Ã©» вместо «é». Unicode заменил их все; UTF-8 сохраняет байты 0–127 идентичными ASCII и использует 2–4 байта выше. Инспектор Unicode показывает эти байты.
Окончания строк
Unix завершает строки LF (10); Windows — CR LF (13 10); классическая Mac OS использовала один CR. Телетайпам нужны были оба: возврат каретки, чтобы вернуть головку, и перевод строки, чтобы продвинуть бумагу. \r\n в строке shebang shell-скрипта до сих пор самая частая причина ошибок «bad interpreter».
Вопросы
Какой код ASCII у A?
65 в десятичном, 0x41 в hex, 0101 в восьмеричном, 01000001 в двоичном. Строчная a — 97 (0x61).
Что такое ASCII 10 и 13?
10 — это LF (перевод строки, \n), а 13 — CR (возврат каретки, \r). Unix использует только LF; Windows — CR LF.
Почему Ctrl-C отправляет 3?
Терминалы сбрасывают два старших бита кода буквы: C — это 0x43 = 0100 0011, и 0x43 & 0x1F = 3 (ETX, конец текста). Shell сопоставляет ETX с SIGINT.
0xFF или 255 — это ASCII?
Нет. ASCII заканчивается на 127. 128–255 зависят от кодовой страницы, а в UTF-8 эти значения байтов встречаются только как части многобайтовых символов.