Байт и знак текста не являются одной единицей
Байт состоит из восьми битов. Он описывает объём данных, а не обязательное количество букв. Кодировка устанавливает, какая последовательность байтов соответствует символу. В UTF-8 разные символы могут занимать разное число байтов. Поэтому правило один знак равен одному байту нельзя применять к любому тексту в этой кодировке. Оно подходит к некоторым символам, но не ко всем. Сначала требуется определить кодировку, затем состав строки, а уже потом считать объём представления.
Для выбранных строк расчёт можно выполнить по частям
В строке Mir! каждая из трёх указанных латинских букв занимает один байт в UTF-8. Восклицательный знак также занимает один байт. Всего получается четыре байта. В строке Мир! каждая из трёх выбранных кириллических букв занимает два байта, а восклицательный знак по-прежнему один. Сумма равна семи байтам. Количество рассматриваемых знаков в обеих строках одинаково, но объём их кодированного представления различается. Это свойство выбранной кодировки и символов, а не ошибка подсчёта букв.
Условие о файле может добавлять другие данные
Наш расчёт относится только к двум записанным строкам без завершающего перевода строки, служебной метки и дополнительного оформления. Если текст сохранён в документе с форматированием, файл может содержать сведения о шрифтах, структуре и других свойствах. Тогда размер всего файла не обязан совпадать с суммой байтов видимого текста. Даже в простом текстовом файле нужно учитывать реально сохранённые невидимые символы. Поэтому перед проверкой важно назвать объект подсчёта: кодированная строка, содержимое текстового файла или целый документ определённого формата.
Обобщение должно сохранять границы примера
Из результата нельзя заключить, что любой кириллический знак во всех случаях занимает два байта или что все кодировки работают одинаково. Здесь описаны конкретные обычные буквы и конкретная кодировка. Также сложный видимый знак может состоять из нескольких отдельных кодовых элементов, поэтому повседневное слово символ иногда требует уточнения. Для нашей задачи такая сложность исключена условиями. Полезная привычка состоит в том, чтобы сначала прочитать ограничения, а не сразу умножать число видимых знаков на привычное количество байтов.
Попробуйте на практике
Сравните две заданные строки на бумаге, используя сведения о размерах их символов из текста.
- Запишите Мир! и Mir! отдельно. Посчитайте в каждой строке буквы и знак препинания, не добавляя пробелы вокруг текста.
- Под каждой выбранной кириллической буквой поставьте два байта, под каждой латинской буквой и восклицательным знаком один байт. Сложите значения внутри каждой строки.
- Переведите полученные объёмы в биты, умножив число байтов на восемь. Сохраните отдельно количество текстовых знаков.
- Подпишите условия расчёта: UTF-8, только указанные строки, без перевода строки и служебных данных. Объясните, почему размер оформленного документа нельзя вывести из этого примера напрямую.
Как проверить результат. Обе строки содержат четыре рассматриваемых знака. Мир! занимает семь байтов, или пятьдесят шесть битов; Mir! четыре байта, или тридцать два бита. Единицы подсчёта и условия кодирования различены.
Частые вопросы
Пробел тоже может занимать место в данных?
Да. Если он действительно присутствует в строке, его нужно учитывать. В нашем примере пробелы вокруг записей не входят в заданный текст.
Другая кодировка обязательно даст те же размеры?
Нет. Представление зависит от выбранной кодировки. Поэтому результат для UTF-8 нельзя автоматически переносить на иной способ хранения текста.
Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.