"Информатика (базовый и углублённый уровни) (в 2 частях)", Поляков К.Ю., Еремин Е.А.
Кодирование символов — способ представить текст числами, с которыми компьютер умеет работать. Каждому знаку сопоставляют код, а затем записывают его в памяти в виде битов и байтов. Таблица кодов помогает программе превратить символ в число и восстановить его при чтении. Unicode задаёт коды для знаков множества языков, а UTF-8 определяет способ записывать эти коды байтами. Чтобы текст отображался правильно, программа должна знать используемую кодировку.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Кодирование символов — представление каждого символа числовым кодом, который компьютер может хранить и обрабатывать. Компьютер работает с данными в виде битов, поэтому текст перед сохранением нужно перевести в числовую форму. Такое представление позволяет хранить буквы, цифры и знаки пунктуации в одной памяти.
Код символа — число, однозначно сопоставленное символу в определённой системе кодирования. Например, символу в таблице может соответствовать число 65. Зная это число и используемую систему, программа понимает, какой знак нужно показать или обработать.
Кодовая таблица — соответствие между символами и их числовыми кодами. По ней программа превращает знак в код при сохранении и выполняет обратное преобразование при чтении. Таблица нужна, чтобы отправитель и получатель текста одинаково понимали значения кодов.
Unicode — стандарт, задающий коды для символов письменностей разных языков и других знаков. Он нужен, чтобы в текстах можно было использовать множество алфавитов, цифр, пунктуационных и специальных символов. Это не то же самое, что конкретная запись кодов в байтах.
Чтобы хранить текст в памяти, каждому его символу сопоставляют число, а число записывают в двоичном виде. В основе компьютерной памяти лежат биты, поэтому именно такая форма подходит для хранения и обработки. Например, программа может преобразовать введённую букву в её код, а затем записать соответствующие биты в файл. При отображении текста преобразование выполняется в обратном порядке.
Кодовая таблица задаёт, какой знак соответствует каждому числовому коду, и тем самым связывает ввод, хранение и вывод текста. Если программа при чтении использует другую таблицу, она может принять записанное число за код иного символа. Поэтому отправитель и получатель данных должны пользоваться согласованной кодировкой. Этот принцип действует и при обмене файлами между разными устройствами.
В ранних кодировках количество разрядов ограничивало число возможных кодов. Если код записан фиксированным небольшим числом битов, таблица вмещает только ограниченный набор знаков. Для одного языка этого могло хватить, но в набор не помещались все буквы других языков и дополнительные символы. Поэтому создавались разные таблицы, а текст, сохранённый для одной из них, мог некорректно отображаться в другой.
Unicode решает задачу общего набора: он назначает кодовые позиции знакам множества письменностей и другим символам. Благодаря этому в одном тексте можно сочетать знаки разных языков, не подбирая для каждого отдельную таблицу. Однако назначить символу кодовую позицию — ещё не значит определить, какими байтами она будет записана в файле. Для записи нужны правила кодирования, и Unicode не задаёт только один обязательный вариант такой записи.
UTF-8 — один из способов кодировать кодовые позиции Unicode последовательностями из одного или нескольких байтов. Длина зависит от символа: часто встречающиеся знаки могут занимать меньше места, а символы с другими кодовыми позициями — больше. ASCII-символы в UTF-8 сохраняют свои однобайтовые коды, поэтому тексты и программы, рассчитанные на ASCII, совместимы с этой частью UTF-8. Из-за переменной длины размер файла нельзя всегда точно определить только по количеству символов.
| Характеристика | ASCII | Unicode | UTF-8 |
|---|---|---|---|
| Что задаёт | Набор символов и их коды | Кодовые позиции символов | Способ записи кодов Unicode байтами |
| Как представляются символы | Кодами из ограниченного набора | Числовыми кодовыми позициями | Последовательностями переменной длины |
| Совместимость с ASCII | Исходная система | Включает коды ASCII в своём наборе | ASCII-символы имеют те же однобайтовые коды |
| Для чего применяется | Простой текст и ранние системы | Общий набор символов разных языков | Хранение и передача текста Unicode |
Сначала определите, что именно задаёт каждый столбец: набор кодов, кодовые позиции или способ их записи байтами. Затем сравните, как представляются знаки и насколько способ совместим с ASCII. Это помогает не путать Unicode как стандарт кодов и UTF-8 как формат их записи.
Условие: символу в кодовой таблице соответствует десятичный код 65. Запишите его восьмибитное двоичное представление. Нужно перевести число в двоичную систему и получить запись ровно из восьми разрядов. Нули слева не меняют значение числа, но помогают выдержать заданную длину.
Ответ: 01000001. Проверка: значение записи равно 64 + 1 = 65, значит, перевод выполнен верно. Сам код при этом остаётся числом 65, а последовательность 01000001 — его восьмибитная двоичная запись.
Условие: в однобайтной кодировке каждый символ занимает один байт. Сколько байт потребуется для хранения текста из 120 символов без дополнительных данных? В условии уже дано, что все знаки представлены одним байтом, поэтому достаточно найти общий объём. Это предположение важно: для кодировки переменной длины расчёт мог бы дать другой результат.
Ответ: 120 байт. Такой вывод относится именно к указанной однобайтной кодировке. Если бы в задаче речь шла о UTF-8, пришлось бы знать, какие именно символы входят в текст, поскольку их длина может различаться.
Условие: текст сохранён в одной кодировке, а открыт программой, использующей другую. Вместо букв появляются посторонние знаки; нужно объяснить причину и предложить исправление. Сам файл может содержать исходные байты без повреждений. Проблема часто возникает на этапе их преобразования в символы.
Ответ: посторонние знаки появляются из-за несовпадения кодировок; следует указать программе исходную кодировку файла. Проверить решение можно по тому, стали ли буквы отображаться ожидаемым образом. Если байты были заменены или файл уже пересохранён с ошибочными данными, одного выбора кодировки может оказаться недостаточно.
Считать, что любой символ всегда занимает один байт. Так думают, перенося правило простой однобайтной кодировки на все способы хранения текста. В UTF-8 длина зависит от символа, поэтому проверяйте, какая кодировка указана и какие знаки входят в текст.
Смешивать Unicode и UTF-8. Причина — оба понятия связаны с кодами символов, но выполняют разные задачи. Unicode задаёт кодовые позиции, а UTF-8 записывает их байтами; перед ответом уточните, спрашивают ли о наборе кодов или о способе записи.
Считать код символа его двоичной записью. Двоичная форма — это представление числа, а не само понятие кода: одно и то же число можно записать в разных системах счисления. Проверьте себя переводом числа между десятичной и двоичной формами — его значение должно оставаться неизменным.
Полагать, что при неверной кодировке данные обязательно потеряны. Часто байты не испорчены, а лишь прочитаны по другой таблице, поэтому допускают ошибку, сразу считая файл безнадёжным. Попробуйте открыть его с исходной кодировкой; если текст восстановился, данные сохранились.
Для понимания кодирования символов полезно уметь переводить числа между двоичной и десятичной системами счисления: код является числом, а компьютер хранит данные в битах и байтах. Знание этих единиц помогает разбирать запись кодов и оценивать объём текста. На практике кодирование используется при хранении и передаче сообщений, в текстовых редакторах, веб-страницах и файлах на разных языках. Поэтому тема связана не только с устройством компьютера, но и с повседневной работой с цифровыми документами.
Почему компьютер не хранит буквы непосредственно?
Память компьютера устроена так, что данные в ней представлены битами — нулями и единицами. Поэтому символу сопоставляют число, которое можно записать в двоичном виде. При чтении программа по кодировке восстанавливает знак.
Чем код символа отличается от его двоичной записи?
Код символа — это число, назначенное знаку в определённой системе. Двоичная запись — один из способов записать это число; его можно также представить, например, в десятичной системе. Для хранения компьютеру нужна согласованная последовательность битов.
Чем Unicode отличается от UTF-8?
Unicode назначает символам кодовые позиции, то есть определяет, какое число соответствует каждому знаку. UTF-8 — способ записать эти числа последовательностями байтов. Поэтому Unicode и UTF-8 связаны, но не являются одним и тем же.
Почему один и тот же файл может отображаться разными знаками в разных программах?
Программы могут по-разному трактовать одни и те же байты, если используют разные кодировки. Тогда числовые значения связываются не с теми буквами, для которых текст был сохранён. Обычно помогает открыть файл, указав исходную кодировку.
Сколько байтов занимает символ в UTF-8?
В UTF-8 символ занимает от одного до нескольких байтов — длина зависит от его кодовой позиции. Символы ASCII записываются одним байтом. Поэтому нельзя считать, что каждый знак любого текста в UTF-8 занимает один байт.
§ 15. Кодирование символов