Кодировка: система представления символов¶
Кодировка — это способ представления символов (букв, цифр, знаков) в виде чисел или последовательностей битов, который позволяет хранить, обрабатывать и передавать текстовые данные в компьютерах и цифровых устройствах. Кодировка определяет соответствие между каждым символом и его числовым кодом, а также правила разбиения текста на байты при сохранении в файлах и передаче по каналам связи.
¶Основные понятия
Для работы с текстом компьютеру необходимо представить каждый символ в виде числа. Набор символов, для которых определены коды, называется кодовой страницей (character set). Само правило сопоставления символов и чисел и есть кодировка.
Ключевые понятия:
- Кодовая страница — конечный набор символов с присвоенными им кодами.
- Кодировка — правило преобразования текста в последовательность чисел (и обратно).
- Кодировка символов (в широком смысле) — то же самое, что и кодировка текста.
- Кодировка файла — признак, записываемый в метаданные файла, указывающий, какой набор символов использован.
¶Краткая история
¶Ранние кодировки
В эпоху телетайпов и первых ЭВМ текст кодировался с использованием 5- и 7-битных кодов. Наиболее известной стала ASCII (American Standard Code for Information Interchange), принятая в 1963 году. Она использует 7 бит и позволяет закодировать 128 символов: латинские буквы, цифры, основные знаки препинания и управляющие символы. ASCII стала основой для большинства последующих кодировок.
¶Кодировки с расширенным набором
Для поддержки национальных алфавитов 7 бит оказалось недостаточно. Появились 8-битные кодировки, в которых старший бит использовался для расширения набора символов до 256 позиций. В СССР и России была разработана кодировка KOI-8 (в частности, KOI-8-R для русского языка), а также применялись CP866 (кодовая страница MS-DOS для кириллицы) и Windows-1251 (кодовая страница Microsoft для кириллицы). Каждая из этих кодировок по-своему раскладывала русские буквы по таблице кодов, что создавало проблемы совместимости: текст, набранный в одной кодировке, отображался «кракозябрами» при открытии в другой.
¶Юникод
В 1990-х годах для решения проблемы множества несовместимых кодировок был создан Юникод (Unicode) — стандарт, который стремится включить символы всех письменностей мира. В Юникоде каждому символу присваивается уникальный номер — кодовая точка (code point), обычно записываемая в виде U+XXXX (например, U+0416 — русская буква «Ж»).
Для хранения и передачи текста в формате Юникода используются несколько схем кодирования:
| Схема | Размер символа | Примечание |
|---|---|---|
| UTF-8 | 1–4 байта | Переменная длина, обратно совместима с ASCII |
| UTF-16 | 2 или 4 байта | Используется в Windows API, Java |
| UTF-32 | 4 байта | Фиксированный размер, простой, но объёмный |
UTF-8 стала доминирующей кодировкой в интернете: по различным оценкам, более 98 % всех веб-страниц используют именно её. Она совместима с ASCII (латинские символы занимают один байт и имеют те же коды), что упростило переход к ней.
¶Кодировка в файлах и программах
¶Проблема определения кодировки
Если файл хранит только байты, программа не может однозначно определить, какой кодировкой они закодированы. На практике используются следующие подходы:
- Метаданные файла: форматы HTML, XML, EPUB содержат явное указание кодировки (например,
<meta charset="UTF-8">). - BOM (Byte Order Mark): специальный сигнатурный байт (или несколько) в начале файла, указывающий на кодировку и порядок байтов (используется в UTF-8, UTF-16).
- Эвристики: программы могут анализировать частоту байтов и пытаться угадать кодировку (например, библиотека chardet).
¶Кодировка строк в языках программирования
В разных языках программирования текст хранится по-разному:
- Python 3 — строки по умолчанию хранят символы Юникода, а при записи в файл используется кодировка по умолчанию (обычно UTF-8), которую можно указать явно.
- Java — строки внутренне представляются в UTF-16.
- C/C++ — строки являются массивами байтов, кодировка определяется программистом.
- JavaScript — строки хранят символы в UTF-16.
¶Кодировка и интернет
В ранние годы веба использовалось множество кодировок, что приводило к искажению текста. Стандарт HTML5 упростил ситуацию, по умолчанию предполагая UTF-8 для всех документов. Протокол HTTP позволяет передавать кодировку в заголовке Content-Type (например, text/html; charset=utf-8).
¶Транслитерация и обратная задача
Иногда возникает необходимость не в кодировке, а в транслитерации — замене символов одного алфавита на схожие по написанию символы другого (например, «привет» → «privet»). Это не кодировка в строгом смысле, а способ передачи текста средствами, не поддерживающими нужный алфавит.
¶Интересные факты
- Кодировка KOI-8-R была разработана в 1993 году в России и стала стандартом для русского сегмента интернета в 1990-е годы.
- Переход от KOI-8-R и Windows-1251 к UTF-8 в рунете занял около десятилетия (примерно 2000–2010 годы).
- В Юникоде на 2024 год закодировано более 150 000 символов из сотен письменностей.
Источники:
- Юникод: стандарты и спецификации (unicode.org)
- RFC 3629 — UTF-8, transformation format of ISO 10646
- ГОСТ и справочники по кодировкам KOI-8, Windows-1251
- Книга «Юникод и многобайтовые кодировки» (Unicode Consortium)
