"Информатика (углублённый уровень)", Калинин И.А., Самылкина Н.Н.
Текст в компьютере хранится не как последовательность букв, а как набор двоичных данных. Каждому символу по определённым правилам сопоставляется код, а затем коды записываются в файл или передаются по сети. От выбранной кодировки зависят поддерживаемые письменности, объём текста и правильность его отображения. Разберём алфавиты, кодовые таблицы, Unicode, UTF-8 и UTF-16, а также научимся вычислять размер текстовых данных.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Алфавит текста — набор символов, которыми можно записывать сообщения: букв, цифр, знаков препинания и других символов. Число символов в алфавите называют его мощностью. Она показывает, сколько разных вариантов нужно различать при кодировании.
Кодирование текстовой информации — представление символов текста с помощью кодов, например последовательностей битов. Благодаря этому компьютер может хранить, обрабатывать и передавать текст как обычные двоичные данные. Кодирование не меняет смысл сообщения, если правила известны обеим сторонам.
Код символа — двоичное представление, сопоставленное определённому символу по принятому правилу. Например, букве или цифре назначается своя комбинация нулей и единиц. По такому коду программа восстанавливает исходный знак.
Кодовая таблица описывает соответствие между символами и их кодами. Отправитель и получатель должны пользоваться совместимыми правилами, иначе одинаковые байты будут превращаться в разные знаки. Поэтому при открытии файла важно правильно определить его кодировку.
Пусть алфавит содержит N символов, а код каждого символа имеет одинаковую длину. L бит дают 2ᴸ комбинаций, поэтому нужно, чтобы 2ᴸ ≥ N. Отсюда минимальная длина равна ⌈log₂ N⌉ битам: результат округляют вверх, ведь дробное число битов использовать нельзя. Например, для 33 символов потребуется уже 6 бит.
При кодировании программа заменяет каждый знак текста его кодом из таблицы. Получившиеся коды соединяются в последовательность битов, разбиваются на байты и записываются в файл или отправляются по сети. При чтении выполняется обратная операция: байты интерпретируются по той же таблице и превращаются в символы. Совпадение правил необходимо, потому что сами нули и единицы не содержат сведений о том, какой знак им соответствовал.
Однобайтовая кодировка использует 8 бит, то есть может различать не более 256 кодов. Этого достаточно для ограниченного набора, например латинских букв, цифр и знаков, но недостаточно для символов многих письменностей сразу. Кроме того, разные таблицы могут назначить одному и тому же байту разные символы. Поэтому файл, записанный в одной однобайтовой кодировке, при открытии в другой иногда превращается в набор неправильных знаков.
Unicode создаёт единую систему кодов для символов латиницы, кириллицы, иероглифов, математических знаков и других письменностей. Сам Unicode задаёт, какой код относится к символу, но не определяет единственный способ хранения этого кода в байтах. UTF-8 кодирует символы последовательностями длиной от 1 до 4 байтов и сохраняет совместимость с базовой латиницей. UTF-16 обычно использует 2 байта, а для части символов — 4 байта.
Чтобы найти объём текста, нужно сложить размеры кодов всех его символов. При фиксированной длине достаточно умножить число символов на размер одного кода. В кодировке переменной длины сначала разделяют символы на группы и считают объём каждой группы отдельно. Служебные данные файла, например заголовок или метаданные, в простых задачах обычно не учитывают.
| Свойство | Однобайтовая кодировка | UTF-8 | UTF-16 |
|---|---|---|---|
| Размер кода символа | 1 байт | От 1 до 4 байтов | Обычно 2, иногда 4 байта |
| Набор символов и поддержка разных письменностей | Ограниченный набор, зависит от таблицы | Символы Unicode множества письменностей | Символы Unicode множества письменностей |
| Как представлены символы вне основного набора | Могут отсутствовать или заменяться | Дополнительными байтами | Дополнительными кодовыми единицами |
| Как определить объём текста в байтах | Число символов умножить на 1 | Сложить размеры кодов конкретных символов | Сложить размеры кодовых единиц конкретных символов |
Таблицу удобно использовать, когда нужно выбрать кодировку или объяснить различие между системой кодов и способом хранения. Сначала определите набор символов, затем выясните, одинаковую или переменную длину имеют их коды. Для расчёта размера всегда ориентируйтесь на конкретные символы, а не только на название кодировки.
Задача 1. Алфавит содержит 32 символа. Определите минимальное число битов для кодирования одного символа и объём сообщения из 100 символов при коде фиксированной длины.
Ответ: 5 битов на символ, 500 битов на сообщение.
Задача 2. Текст из 240 символов записан в однобайтовой кодировке. Найдите его объём в байтах и битах, не учитывая служебные данные файла.
Ответ: 240 байт, или 1920 битов.
Задача 3. Строка состоит из 10 латинских и 5 кириллических букв. В UTF-8 латинская буква занимает 1 байт, а кириллическая — 2 байта. Найдите объём строки.
Ответ: строка занимает 20 байт.
Не округлять log₂ N вверх. Иногда считают дробный результат готовым числом битов, но фиксированный код не может иметь, например, 4,3 бита. Проверьте себя условием 2ᴸ ≥ N и возьмите ближайшее целое L.
Считать, что символ всегда занимает один байт. Такое правило верно только для однобайтовой кодировки. Уточните кодировку и размер именно данного символа, особенно если используется UTF-8 или UTF-16.
Путать Unicode с UTF-8 и UTF-16. Unicode определяет систему кодов символов, а UTF-8 и UTF-16 задают способы представления этих кодов в байтах. Для проверки спросите себя: речь идёт о таблице символов или о формате хранения?
Считать байтовую последовательность однозначной без указания кодировки. Один и тот же байт может иметь разные значения в разных таблицах. Если текст отображается неправильно, проверьте, совпадает ли кодировка файла с кодировкой, выбранной программой.
Для понимания темы нужны двоичная система счисления, понятия бита и байта, а также умение переводить числа между системами счисления. Эти знания объясняют, почему один байт содержит 8 битов и сколько различных кодов можно получить.
Представление текста связано с оценкой объёма файлов и скорости передачи данных: чем больше байтов, тем больше места и времени требуется. Тема также подготавливает к изучению общего кодирования информации и устройства компьютера, где любые данные хранятся в двоичном виде.
Почему для кодирования 32 символов достаточно пяти бит?
Пять бит дают 2⁵ = 32 различных комбинации. Поэтому каждой из 32 букв или знаков можно назначить отдельную комбинацию.
Почему один и тот же текст может занимать разное место в разных кодировках?
Кодировки используют разные правила и разную длину кодов. Например, символ в однобайтовой кодировке занимает 1 байт, а в UTF-8 некоторые символы — 2, 3 или 4 байта.
Чем Unicode отличается от UTF-8?
Unicode задаёт единую систему кодов для символов разных письменностей. UTF-8 — это способ представить эти коды последовательностями байтов переменной длины.
Сколько байтов занимает кириллическая буква в UTF-8?
Обычно кириллическая буква занимает 2 байта в UTF-8. Точный размер зависит от конкретного символа, поэтому для специальных знаков правило может отличаться.
Почему текст иногда отображается набором непонятных символов?
Обычно файл читают не в той кодировке, в которой его записали. Одна и та же последовательность байтов при разных кодовых таблицах может означать разные символы.
§ 23. Представление и хранение текстовой информации