Открыть сервисСервис

Кодировка: система представления символов

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

Основные понятия

Для работы с текстом компьютеру необходимо представить каждый символ в виде числа. Набор символов, для которых определены коды, называется кодовой страницей (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-81–4 байтаПеременная длина, обратно совместима с ASCII
UTF-162 или 4 байтаИспользуется в Windows API, Java
UTF-324 байтаФиксированный размер, простой, но объёмный

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)
Заметили ошибку или не согласны с информацией в статье? Напишите нам support@bfometr.ru