Сравнение кодировок текста
Чтобы сравнить объём текста в разных кодировках, сначала считают количество символов, а затем определяют, сколько байтов занимает каждый символ в выбранной кодировке. Важно не путать число символов с размером файла: одна и та же строка может содержать одинаковое число символов, но занимать разное количество байтов.
Основные понятия
Размер текстового файла обычно измеряют в байтах. Байты хранят не «буквы вообще», а их числовые коды, заданные определённой кодировкой. Поэтому для ответа нужно знать и содержание текста, и правило кодирования.
Символ — элемент текста: буква, цифра, пробел, знак препинания или служебный знак перевода строки. Кодировка символов — правило, сопоставляющее символам двоичные коды. Число символов зависит от текста, а число байтов — от текста и кодировки.
При подсчёте символов учитывают каждый знак, если условие не говорит обратное: буквы, цифры, пробелы, точки, запятые, скобки и обычно символы перевода строки. Слово из пяти букв и пробел между словами дают шесть символов.
Сначала перепишите текст и посчитайте все его символы. Не заменяйте несколько цифр одним числом: запись «2025» содержит четыре символа. Аналогично, слово «тест» содержит четыре символа.
ASCII: один символ — один байт
ASCII — таблица кодов для 128 символов: латинских букв, цифр, знаков препинания и управляющих символов. В школьных задачах символ ASCII занимает 1 байт, то есть 8 бит, хотя исходная таблица использует 7 значащих битов.
Если текст состоит только из символов ASCII и содержит \(N\) символов, его размер без учёта дополнительных служебных данных равен \(N\) байтам. К ASCII относятся, например, латинские буквы A–Z и a–z, цифры 0–9, пробел и многие знаки препинания. Русские буквы в ASCII не входят.
Для текста из \(N\) ASCII-символов размер равен \(N\) байтам, или \(8N\) битам.
Юникод и UTF-8
Кодовая позиция символа в Юникоде — это номер символа в едином наборе, включающем латиницу, кириллицу, иероглифы, математические знаки и эмодзи. Само слово «Юникод» обозначает набор символов и кодовых позиций, а не единственный способ хранения в байтах.
UTF-8 — способ записать кодовые позиции Юникода последовательностями байтов. Он совместим с ASCII: любой ASCII-символ в UTF-8 занимает ровно 1 байт. Большинство русских букв занимает 2 байта, многие другие символы — 3 или 4 байта.
| Символ или группа символов | Размер в UTF-8 |
|---|---|
| ASCII-символ: A, 7, пробел, ! | 1 байт |
| Большинство кириллических букв: А, б, я | 2 байта |
| Многие знаки и иероглифы | 3 байта |
| Некоторые эмодзи и редкие символы | 4 байта |
Здесь \(N\) — число символов, а \(b_i\) — количество байтов для \(i\)-го символа. Если известны количества групп символов, удобнее сложить их вклад: \(B=n_1\cdot1+n_2\cdot2+n_3\cdot3+n_4\cdot4\).
В некоторых школьных задачах под «кодировкой Юникод» условно понимают фиксированное хранение: 2 байта на символ. Это правило действует только тогда, когда оно явно дано в условии или принято в используемой модели. Нельзя автоматически считать любой Юникод равным 2 байтам: UTF-8 — переменная кодировка.
Сколько байтов занимает строка «AБ» в UTF-8, если «A» — ASCII-символ, а «Б» — русская буква?
Алгоритм сравнения объёма
- Записать текст точно, включая пробелы и знаки препинания.
- Посчитать общее число символов \(N\) или отдельно посчитать группы символов.
- Уточнить кодировку и правило хранения одного символа.
- Для ASCII умножить число символов на 1 байт.
- Для UTF-8 определить размер каждого символа или каждой группы и сложить результаты.
- Если требуется сравнить результаты, привести их к одной единице: байтам или битам.
Сравнивать размеры можно только после перевода в одну единицу. \(1\) байт \(=8\) бит, \(1\) Кбайт в школьных задачах часто принимают равным \(1024\) байтам, если это указано или следует из условия.
Разобранный пример
Сравним размер строки «Cat Кот!» в ASCII и UTF-8. Считаем, что пробел и восклицательный знак входят в текст, а перевод строки отсутствует.
В таком примере важно явно отметить, что вся исходная строка не помещается в классический ASCII: русские буквы требуют другой кодировки. Если в задаче сказано, что «русский текст в ASCII» занимает 1 байт на символ, это уже специальная условная модель, которую нужно использовать буквально.
Частые ошибки
1. Считают только буквы и забывают пробелы или знаки препинания. 2. Принимают количество слов за количество символов. 3. Считают любую букву UTF-8 одним байтом. 4. Смешивают биты и байты: 8 бит — это 1 байт. 5. Считают, что Юникод всегда означает 2 байта. 6. Забывают проверить, можно ли вообще представить данный текст в ASCII. 7. Учитывают кавычки, перенос строки или завершающий нулевой байт, хотя условие их не включает.
Для более сложных задач полезно отдельно рассмотреть Количество символов в тексте и Длину двоичного кода. Если требуется работать не с текстом, а с числом в памяти, применяются другие правила из темы Представление числа в памяти.
Quick-test
Проверьте себя
Главное
- Число символов определяется текстом, а число байтов — текстом и кодировкой.
- В школьной модели ASCII занимает 1 байт на символ, но русские буквы в классический ASCII не входят.
- UTF-8 использует от 1 до 4 байтов на символ; ASCII-символы занимают 1 байт, большинство русских букв — 2 байта.
- «Юникод» — набор символов, а не обязательно правило «2 байта на символ». Такое правило используют только при явном указании в условии.
- Сначала считают символы и группы символов, затем складывают их байтовые размеры и при необходимости переводят байты в биты.