Кодирование текстовой информации: ASCII, Unicode, UTF-8
Буква «Я» на экране - не маленькая ямбическая душа, а код: набор битов, который система считает символом. Пока отправитель и получатель договорились о таблице кодировки, текст читается. Разъехались таблицы - получите «кракозябры».
Кодирование текстовой информации - сопоставление символам алфавита числовых кодов для хранения и передачи текста в двоичном виде.
Общий контекст - в статье про кодирование информации. Системы счисления помогают понять запись кодов: разбор здесь.
Зачем таблицы кодировки
Компьютер хранит числа. Символ нужно свести к числу. Таблица кодировки как раз словарь: символ ↔ код.
ASCII
ASCII - базовый латинский набор (и управляющие коды) в пределах 7 бит, на практике часто в байте. Хватает на английский текст и служебные знаки, мало для кириллицы и мира алфавитов.
Восьмибитные кодировки кириллицы
Чтобы писать по-русски в старых системах, делали 8-битные страницы: Windows-1251, KOI8-R, CP866 и др. Один байт - один символ, но разные таблицы. Файл в KOI8, открытый как CP1251, даёт мусор.
Отсюда правило веб-старины: указывать кодировку явно.
Unicode и UTF-8
Unicode - единое пространство кодов для символов многих письменностей. UTF-8 - способ упаковать эти коды в последовательность байтов: латиница часто 1 байт, кириллица обычно 2, редкие знаки - длиннее.
Сегодня UTF-8 - дефолт для сайтов и большинства современных редакторов. Он закрывает «войну кодовых страниц», если все звенья цепи тоже в UTF-8.
Сколько бит на символ
При равномерном кодировании алфавита из N символов ищут минимальное k: 2k ≥ N. Это связка с единицами измерения информации.
В Unicode длина в байтах уже не всегда равна «один символ = один байт» - зависит от формы представления (UTF-8/UTF-16).
Типичные сбои
- Открыли файл не в той кодировке.
- Смешали UTF-8 и Windows-1251 в одной цепочке почта→сайт→БД.
- Обрезали строку по байтам посередине многобайтового символа.
Ошибки в ответах
- Путают Unicode и UTF-8.
- Считают, что ASCII покрывает русский.
- Пишут, что «кодировка» = шрифт.
Шпаргалка
- Текст в памяти - коды символов.
- ASCII - база для латиницы.
- CP1251/KOI8 - старые 8-битные для кириллицы.
- Unicode задаёт номера символов; UTF-8 - частая упаковка в байты.
- Кракозябры = несовпадение кодировок.