Кодирование текстовой информации
Таблицы кодировок (ASCII, Unicode), количество бит на символ в разных кодировках, расчёт информационного объёма текста.
В этой статье вы сможете узнать:
- как символы текста связаны с числами через таблицы кодировки;
- чем однобайтовые кодировки (например, ASCII) отличаются от многобайтовых (Unicode);
- как рассчитать информационный объём текстового сообщения в разных кодировках.
Принцип кодирования текста
Каждому символу алфавита (буквам, цифрам, знакам препинания, пробелу) ставится в соответствие определённое число — код символа. Этот код хранится в памяти компьютера в двоичном виде. Соответствие между символами и числами задаётся таблицей кодировки.
Однобайтовые кодировки
В однобайтовых кодировках на каждый символ отводится 1 байт (8 бит), поэтому с их помощью можно закодировать не более различных символов.
ASCII — базовая таблица кодировки, в которой первые 128 кодов (от 0 до 127) отведены под управляющие символы, латинские буквы, цифры и знаки препинания и являются стандартными во всех кодировках на основе ASCII. Вторая половина таблицы (коды от 128 до 255) в разных кодировках может содержать разные символы — например, буквы национальных алфавитов.
Для русского языка существовало несколько несовместимых друг с другом однобайтовых кодировок (Windows-1251, КОИ8-Р, CP866), в которых кириллические буквы располагались в разных позициях второй половины таблицы — из-за этого при неправильном выборе кодировки текст превращался в набор нечитаемых символов («кракозябры»).
Многобайтовые кодировки: Unicode
Поскольку 256 символов недостаточно для одновременного представления всех алфавитов мира, был разработан стандарт Unicode, использующий большее количество бит на символ.
UTF-16 отводит 2 байта (16 бит) на большинство символов, что позволяет закодировать до различных символов.
UTF-32 отводит 4 байта (32 бита) на каждый символ, что позволяет закодировать до символов, охватывая все существующие письменности.
UTF-8 — кодировка переменной длины: символы базовой латиницы кодируются 1 байтом (для совместимости с ASCII), а остальные символы (в том числе кириллица) — 2, 3 или 4 байтами в зависимости от диапазона кода символа.
Расчёт объёма текста
Информационный объём текста вычисляется умножением количества символов на количество бит (или байт), отведённых на один символ в используемой кодировке:
где — число символов в тексте, а — число бит (или байт) на один символ.
Пример. Текст содержит 500 символов и хранится в кодировке Windows-1251 (1 байт на символ). Каков объём текста в байтах?
Пример. Тот же текст из 500 символов хранится в кодировке UTF-16 (2 байта на символ). Каков объём текста в байтах?
Особенность подсчёта объёма в UTF-8
Поскольку UTF-8 — кодировка переменной длины, для точного расчёта объёма текста нужно знать, сколько байт занимает каждый конкретный символ: символы из базовой латиницы и управляющие символы кодируются 1 байтом, кириллица и большинство европейских алфавитов — 2 байтами, символы некоторых восточных письменностей — 3 байтами, редкие символы (например, часть эмодзи) — 4 байтами.
Пример. Строка из 10 латинских букв и 5 кириллических символов сохранена в UTF-8. Каков её объём в байтах?
Латинские буквы: байт.
Кириллические символы: байт.
Итого: байт.
Алгоритм решения задач на кодирование текста
- Определите, какая кодировка используется в задаче, и сколько бит (или байт) она отводит на один символ.
- Если кодировка однобайтовая (ASCII, Windows-1251 и подобные) — умножьте число символов на 1 байт.
- Если кодировка имеет фиксированную длину больше 1 байта (UTF-16, UTF-32) — умножьте число символов на соответствующее число байт.
- Если кодировка имеет переменную длину (UTF-8) — определите, сколько символов из каждой группы (латиница, кириллица и так далее) содержится в тексте, и посчитайте объём для каждой группы отдельно, а затем сложите результаты.
- При необходимости переведите итоговый результат в другие единицы измерения (биты, килобайты).
Примеры решения
Пример 1. Строка содержит 120 символов в кодировке ASCII. Найдите объём строки в битах.
Ответ: 960 бит.
Пример 2. Текстовый файл занимает 2 Кбайта и записан в кодировке, где на каждый символ отводится 16 бит. Сколько символов содержит файл?
Переводим объём в биты: бита.
Находим число символов: .
Ответ: 1024 символа.
Пример 3. Строка из 8 кириллических символов сохранена сначала в кодировке Windows-1251, а затем в UTF-8. На сколько байт отличаются объёмы этих файлов?
В Windows-1251: байт.
В UTF-8 (кириллица кодируется 2 байтами): байт.
Разница: байт.
Ответ: на 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-Р, поэтому при чтении текста важно знать, в какой кодировке он был сохранён.
Похожие темы для изучения
- Кодирование и измерение информации
- Кодирование графической информации
- Кодирование звуковой информации
- Системы счисления: перевод чисел между системами
Задачи для самостоятельного решения
- Строка содержит 300 символов и хранится в кодировке ASCII. Найдите объём строки в байтах.
- Текст занимает 4 Кбайта в кодировке UTF-16. Сколько символов он содержит?
- Строка из 6 латинских и 4 кириллических символов сохранена в UTF-8. Найдите объём строки в байтах.
- Сравните объём одной и той же строки из 50 символов в кодировках Windows-1251 и UTF-32.
- Файл в кодировке ASCII занимает 1 Кбайт. Сколько символов в нём содержится?
- Объясните, почему при открытии текстового файла в неправильной кодировке вместо кириллицы отображаются нечитаемые символы.