tariel.ge › Полезное: бесплатные книги › Программирование: от нулей и единиц до PythonБесплатно · автор Тариел Бежанидзе
← Учебник по программированию ЛИСТ 03БЛОК 0 — КАК УСТРОЕН КОМПЬЮТЕРРЕВ. 1
Глава 03 · Как устроен компьютер изнутри

Кодировки: как из нулей и единиц получается текст

Компьютер физически умеет хранить только числа (главы 01–02). Буква "A" на экране — это просто число, которому договорились присвоить именно такой визуальный вид. Вся эта глава — про то, кто и как договаривался.

ASCII — первая массовая договорённость

ASCII (American Standard Code for Information Interchange) — одна из первых широко принятых таблиц соответствия чисел и символов, изначально 7-битная (128 значений), позже расширенная до 8 бит (256 значений). Покрывает латинские буквы, цифры, знаки препинания и служебные (управляющие) символы вроде перевода строки.

СимволКод (десятичный)Код (hex)
Пробел320x20
0480x30
A650x41
a970x61
Изящная деталь таблицы ASCII

Заглавные и строчные латинские буквы в ASCII всегда отличаются ровно на 32 — не случайность, а намеренное проектное решение: 32 в двоичном виде — это ровно один бит (00100000). Перевести букву из заглавной в строчную или обратно можно, просто переключив один конкретный бит её кода — прямое практическое следствие мышления в терминах битов из глав 01–02, а не просто "программисты договорились о цифрах".

Проблема ASCII — только английский алфавит

128–256 значений ASCII физически не могут вместить кириллицу, иероглифы, арабское письмо и десятки других систем письменности одновременно. Решение того времени — "кодовые страницы" (code pages): разные несовместимые друг с другом 8-битные таблицы для разных языков, например Windows-1251 для кириллицы, ISO-8859-1 для западноевропейских языков с диакритикой.

Классический баг: "кракозябры" при неверной кодировке

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

Unicode — одна таблица для всех систем письменности сразу

Unicode решает проблему кардинально иначе — не десятки несовместимых 8-битных таблиц, а единый стандарт, присваивающий каждому символу каждой системы письма в мире (и не только — включая эмодзи) собственный уникальный номер, называемый кодовой точкой (code point). Диапазон кодовых точек огромен — больше миллиона возможных значений, записываются они в формате U+XXXX — тот самый шестнадцатеричный формат из главы 02, здесь применённый не абстрактно, а к реальному повседневному стандарту.

UTF-8 — как Unicode реально хранится в файлах

Сам по себе Unicode — это только таблица соответствия "номер → символ". Отдельный вопрос — как эти номера физически записывать байтами в файл или передавать по сети. Самое распространённое решение — UTF-8, кодировка переменной длины:

Почему 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)

В Python 3 строки внутри программы работают в терминах символов Unicode напрямую — программисту обычно не нужно вручную думать о кодировке, пока речь идёт только о работе с текстом внутри кода. Но при чтении или записи текста в файл (глава 19) кодировка снова становится практическим вопросом — файл на диске это просто последовательность байтов, и нужно явно указать (или довериться разумному значению по умолчанию), как эти байты превращать в символы и обратно — ровно то, что разбиралось в этой главе.

Что дальше

Числа и текст физически представлены — но как из нулей и единиц получается не просто данные, а действие, программа, которая что-то делает? Следующая глава — от машинного кода к языкам высокого уровня.

Глава03 — Кодировки
Блок0 — Как устроен компьютер
Далее04 — Что такое программа
СтатусГотово · рев. 1
Предыдущая глава ← 02 · Системы счисления Следующая глава 04 · Что такое программа →

Книга бесплатна для чтения. Автор — Тариел Бежанидзе, компьютерный мастер в Батуми · tariel.ge · все бесплатные книги. Копировать текст целиком на другие сайты — только со ссылкой на источник.