Компьютер физически умеет хранить только числа (главы 01–02). Буква "A" на экране — это просто число, которому договорились присвоить именно такой визуальный вид. Вся эта глава — про то, кто и как договаривался.
ASCII (American Standard Code for Information Interchange) — одна из первых широко принятых таблиц соответствия чисел и символов, изначально 7-битная (128 значений), позже расширенная до 8 бит (256 значений). Покрывает латинские буквы, цифры, знаки препинания и служебные (управляющие) символы вроде перевода строки.
| Символ | Код (десятичный) | Код (hex) |
|---|---|---|
| Пробел | 32 | 0x20 |
| 0 | 48 | 0x30 |
| A | 65 | 0x41 |
| a | 97 | 0x61 |
Заглавные и строчные латинские буквы в ASCII всегда отличаются ровно на 32 — не случайность, а намеренное проектное решение: 32 в двоичном виде — это ровно один бит (00100000). Перевести букву из заглавной в строчную или обратно можно, просто переключив один конкретный бит её кода — прямое практическое следствие мышления в терминах битов из глав 01–02, а не просто "программисты договорились о цифрах".
128–256 значений ASCII физически не могут вместить кириллицу, иероглифы, арабское письмо и десятки других систем письменности одновременно. Решение того времени — "кодовые страницы" (code pages): разные несовместимые друг с другом 8-битные таблицы для разных языков, например Windows-1251 для кириллицы, ISO-8859-1 для западноевропейских языков с диакритикой.
Если текст сохранён в одной кодовой странице, а программа при открытии предполагает другую — те же самые числа интерпретируются как совершенно другие символы, и на экране вместо осмысленного текста появляется нечитаемая последовательность знаков — знакомая многим проблема "кракозябр" при открытии старого текстового файла с русским текстом. Это не случайная порча данных, а буквальное следствие того, что один и тот же байт в разных кодовых страницах означает разные символы.
Unicode решает проблему кардинально иначе — не десятки несовместимых
8-битных таблиц, а единый стандарт, присваивающий каждому символу каждой системы письма в
мире (и не только — включая эмодзи) собственный уникальный номер, называемый кодовой точкой
(code point). Диапазон кодовых точек огромен — больше миллиона возможных значений,
записываются они в формате U+XXXX — тот самый шестнадцатеричный формат из
главы 02, здесь применённый не абстрактно, а к реальному повседневному стандарту.
Сам по себе Unicode — это только таблица соответствия "номер → символ". Отдельный вопрос — как эти номера физически записывать байтами в файл или передавать по сети. Самое распространённое решение — UTF-8, кодировка переменной длины:
В UTF-8 обычные латинские символы (те же, что были в ASCII) кодируются ровно одним байтом — точно так же, как в старом ASCII. Символы других систем письменности (кириллица, иероглифы и так далее) занимают 2–4 байта. Это даёт полную обратную совместимость: любой старый чисто ASCII-текстовый файл — это уже корректный UTF-8 файл без каких-либо изменений, а новые системы получают доступ к полному диапазону символов Unicode без разрыва с полувековой историей ASCII-текста. Именно эта совместимость, а не только сама идея Unicode, объясняет, почему UTF-8 стал стандартом веба и большинства современного программного обеспечения.
Есть и альтернативы: UTF-16 (используется, например, внутренне в Windows и в некоторых языках вроде Java) хранит большинство символов двумя байтами; UTF-32 использует фиксированные 4 байта на каждый символ без исключений — просто и предсказуемо по размеру, но менее компактно для текста, преимущественно состоящего из латиницы.
В Python 3 строки внутри программы работают в терминах символов Unicode напрямую — программисту обычно не нужно вручную думать о кодировке, пока речь идёт только о работе с текстом внутри кода. Но при чтении или записи текста в файл (глава 19) кодировка снова становится практическим вопросом — файл на диске это просто последовательность байтов, и нужно явно указать (или довериться разумному значению по умолчанию), как эти байты превращать в символы и обратно — ровно то, что разбиралось в этой главе.
Числа и текст физически представлены — но как из нулей и единиц получается не просто данные, а действие, программа, которая что-то делает? Следующая глава — от машинного кода к языкам высокого уровня.
Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.