Незнайка
Вся теория
Теория· 6 мин чтения

Кодирование текстовой информации

Таблицы кодировок (ASCII, Unicode), количество бит на символ в разных кодировках, расчёт информационного объёма текста.

В этой статье вы сможете узнать:

  • как символы текста связаны с числами через таблицы кодировки;
  • чем однобайтовые кодировки (например, ASCII) отличаются от многобайтовых (Unicode);
  • как рассчитать информационный объём текстового сообщения в разных кодировках.

Принцип кодирования текста

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

Однобайтовые кодировки

В однобайтовых кодировках на каждый символ отводится 1 байт (8 бит), поэтому с их помощью можно закодировать не более 28=2562^8 = 256 различных символов.

ASCII — базовая таблица кодировки, в которой первые 128 кодов (от 0 до 127) отведены под управляющие символы, латинские буквы, цифры и знаки препинания и являются стандартными во всех кодировках на основе ASCII. Вторая половина таблицы (коды от 128 до 255) в разных кодировках может содержать разные символы — например, буквы национальных алфавитов.

Для русского языка существовало несколько несовместимых друг с другом однобайтовых кодировок (Windows-1251, КОИ8-Р, CP866), в которых кириллические буквы располагались в разных позициях второй половины таблицы — из-за этого при неправильном выборе кодировки текст превращался в набор нечитаемых символов («кракозябры»).

Многобайтовые кодировки: Unicode

Поскольку 256 символов недостаточно для одновременного представления всех алфавитов мира, был разработан стандарт Unicode, использующий большее количество бит на символ.

UTF-16 отводит 2 байта (16 бит) на большинство символов, что позволяет закодировать до 216=655362^{16} = 65536 различных символов.

UTF-32 отводит 4 байта (32 бита) на каждый символ, что позволяет закодировать до 2322^{32} символов, охватывая все существующие письменности.

UTF-8 — кодировка переменной длины: символы базовой латиницы кодируются 1 байтом (для совместимости с ASCII), а остальные символы (в том числе кириллица) — 2, 3 или 4 байтами в зависимости от диапазона кода символа.

Расчёт объёма текста

Информационный объём текста вычисляется умножением количества символов на количество бит (или байт), отведённых на один символ в используемой кодировке:

I=L⋅iI = L \cdot i

где LL — число символов в тексте, а ii — число бит (или байт) на один символ.

Пример. Текст содержит 500 символов и хранится в кодировке Windows-1251 (1 байт на символ). Каков объём текста в байтах?

I=500⋅1=500 байтI = 500 \cdot 1 = 500 \text{ байт}

Пример. Тот же текст из 500 символов хранится в кодировке UTF-16 (2 байта на символ). Каков объём текста в байтах?

I=500⋅2=1000 байтI = 500 \cdot 2 = 1000 \text{ байт}

Особенность подсчёта объёма в UTF-8

Поскольку UTF-8 — кодировка переменной длины, для точного расчёта объёма текста нужно знать, сколько байт занимает каждый конкретный символ: символы из базовой латиницы и управляющие символы кодируются 1 байтом, кириллица и большинство европейских алфавитов — 2 байтами, символы некоторых восточных письменностей — 3 байтами, редкие символы (например, часть эмодзи) — 4 байтами.

Пример. Строка из 10 латинских букв и 5 кириллических символов сохранена в UTF-8. Каков её объём в байтах?

Латинские буквы: 10⋅1=1010 \cdot 1 = 10 байт.

Кириллические символы: 5⋅2=105 \cdot 2 = 10 байт.

Итого: 10+10=2010 + 10 = 20 байт.

Алгоритм решения задач на кодирование текста

  1. Определите, какая кодировка используется в задаче, и сколько бит (или байт) она отводит на один символ.
  2. Если кодировка однобайтовая (ASCII, Windows-1251 и подобные) — умножьте число символов на 1 байт.
  3. Если кодировка имеет фиксированную длину больше 1 байта (UTF-16, UTF-32) — умножьте число символов на соответствующее число байт.
  4. Если кодировка имеет переменную длину (UTF-8) — определите, сколько символов из каждой группы (латиница, кириллица и так далее) содержится в тексте, и посчитайте объём для каждой группы отдельно, а затем сложите результаты.
  5. При необходимости переведите итоговый результат в другие единицы измерения (биты, килобайты).

Примеры решения

Пример 1. Строка содержит 120 символов в кодировке ASCII. Найдите объём строки в битах.

I=120⋅8=960 битI = 120 \cdot 8 = 960 \text{ бит}

Ответ: 960 бит.

Пример 2. Текстовый файл занимает 2 Кбайта и записан в кодировке, где на каждый символ отводится 16 бит. Сколько символов содержит файл?

Переводим объём в биты: 2⋅1024⋅8=163842 \cdot 1024 \cdot 8 = 16384 бита.

Находим число символов: L=1638416=1024L = \dfrac{16384}{16} = 1024.

Ответ: 1024 символа.

Пример 3. Строка из 8 кириллических символов сохранена сначала в кодировке Windows-1251, а затем в UTF-8. На сколько байт отличаются объёмы этих файлов?

В Windows-1251: 8⋅1=88 \cdot 1 = 8 байт.

В UTF-8 (кириллица кодируется 2 байтами): 8⋅2=168 \cdot 2 = 16 байт.

Разница: 16−8=816 - 8 = 8 байт.

Ответ: на 8 байт.

Часто задаваемые вопросы

Почему кодировка ASCII содержит только 128 «настоящих» стандартных символов, хотя байт вмещает 256 значений? Исходный стандарт ASCII был 7-битным и определял именно 128 символов; когда кодировки расширили до полного байта (8 бит, 256 значений), первые 128 кодов сохранили значения оригинального ASCII для совместимости, а вторая половина таблицы стала использоваться под национальные алфавиты и дополнительные символы, из-за чего появилось множество несовместимых расширенных кодировок.

Почему в UTF-8 латинские буквы занимают меньше места, чем кириллические? Потому что UTF-8 спроектирован так, чтобы сохранить совместимость с ASCII и минимизировать объём файлов, где преобладает латинский текст, — символы с кодами до 127 (базовая латиница, цифры, часть знаков препинания) кодируются одним байтом, а символы за пределами этого диапазона требуют двух и более байт.

Как определить, сколько байт займёт конкретный символ в UTF-8, если неизвестен его код? На практике для задач ЕГЭ обычно даётся явное указание, сколько байт занимает символ из той или иной группы (например, «латинские буквы — 1 байт, кириллические — 2 байта»); в общем случае это определяется диапазоном кодовой точки символа в таблице Unicode.

Можно ли одним и тем же числом закодировать разные символы в разных кодировках? Да, поскольку разные кодировки задают собственное соответствие между числами и символами — один и тот же числовой код может обозначать разные символы в ASCII, Windows-1251 и КОИ8-Р, поэтому при чтении текста важно знать, в какой кодировке он был сохранён.

Похожие темы для изучения

  • Кодирование и измерение информации
  • Кодирование графической информации
  • Кодирование звуковой информации
  • Системы счисления: перевод чисел между системами

Задачи для самостоятельного решения

  1. Строка содержит 300 символов и хранится в кодировке ASCII. Найдите объём строки в байтах.
  2. Текст занимает 4 Кбайта в кодировке UTF-16. Сколько символов он содержит?
  3. Строка из 6 латинских и 4 кириллических символов сохранена в UTF-8. Найдите объём строки в байтах.
  4. Сравните объём одной и той же строки из 50 символов в кодировках Windows-1251 и UTF-32.
  5. Файл в кодировке ASCII занимает 1 Кбайт. Сколько символов в нём содержится?
  6. Объясните, почему при открытии текстового файла в неправильной кодировке вместо кириллицы отображаются нечитаемые символы.