"Информатика (базовый уровень) (в 2 частях)", Под ред. Макаровой Н.В.
Компьютер хранит текст не как привычные буквы, а как числовые коды, записанные в двоичном виде. Соответствие между символами и числами задаёт кодовая таблица, а правила такого представления называют кодировкой. Разные кодировки могут по-разному обозначать один символ, поэтому текст иногда отображается неправильно. Для поддержки символов разных языков создан Unicode; один из способов хранения кодов Unicode — UTF-8. Понимание этих правил помогает оценивать размер текстовых файлов и правильно открывать их.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Кодирование текстовой информации — представление символов текста с помощью числовых кодов, которые компьютер может хранить и обрабатывать. Например, буква заменяется числом, а не сохраняется как изображение знака. Это позволяет использовать для текста те же принципы хранения и обработки, что и для других данных.
Кодовая таблица — соответствие между символами текста и назначенными им числовыми кодами. В ней можно найти, какое число обозначает нужную букву, цифру или знак препинания. Таблица нужна, чтобы разные программы одинаково понимали, какой символ стоит за кодом.
Кодировка — конкретный набор правил кодирования символов и представления их кодов в памяти. Она определяет, какие символы можно записать и как прочитать сохранённые данные. Благодаря кодировке программа превращает последовательность байтов обратно в текст.
Unicode — международный стандарт, предназначенный для кодирования символов разных языков в единой системе. Он включает буквы, знаки и символы множества письменностей. Это позволяет обмениваться текстом, не подбирая для каждого языка отдельную несовместимую таблицу.
Компьютер не распознаёт буквы так, как их видит человек: память и процессор работают с данными, представленными числами. Состояния элементов памяти принято обозначать нулём и единицей, поэтому число записывают в двоичной системе. Для текста это означает, что каждой букве или знаку сначала назначают числовой код. Затем этот код сохраняется в виде битов — нулей и единиц.
Кодовая таблица связывает три представления: сам символ, его числовой код и двоичную запись этого числа. Например, если таблица назначает символу код 65, то число 65 при хранении можно записать в двоичной системе как 01000001. Чтобы получить букву при чтении, программа использует те же правила и по коду находит соответствующий знак. Без общего соответствия одни и те же данные разные программы могли бы истолковать по-разному.
ASCII создавали прежде всего для английского текста и базовых знаков, нужных в вычислительной технике. Его исходная таблица содержит латинские буквы, цифры и служебные символы, но не кириллицу. Поэтому русский текст нельзя полностью представить исходным набором ASCII: для русских букв нужны дополнительные коды и другая таблица. Расширение набора не превращает старый ASCII в полноценную кодировку русского языка.
KOI8-R и Windows-1251 — однобайтные кодировки, в которых предусмотрены русские буквы, но соответствия кодов символам у них различаются. Байт — это группа из восьми битов; в однобайтной кодировке он может задавать один символ из доступного набора. Если прочитать файл Windows-1251 как KOI8-R, программа применит к байтам чужую таблицу, и вместо ожидаемых букв появятся другие знаки. Так происходит не потому, что байты обязательно испорчены, а потому, что их истолковали по другим правилам.
Unicode решает задачу представления символов разных языков в общей системе кодов. Однако стандарт символов и способ записи кодов в файл — не одно и то же: Unicode можно хранить разными способами. Например, UTF-8 кодирует Unicode-последовательности переменным числом байтов: распространённые латинские символы обычно занимают один байт, а многие другие символы — больше. Поэтому UTF-8 сохраняет совместимость с ASCII для базовых латинских знаков, одновременно позволяя представлять широкий набор символов.
| Характеристика | ASCII | KOI8-R | Windows-1251 | Unicode (UTF-8) |
|---|---|---|---|---|
| Назначение и область применения | Английский текст и базовые знаки | Русский текст, главным образом в прежних системах | Русский текст в программах и системах Windows | Тексты на разных языках и обмен данными |
| Количество и состав кодируемых символов | 128 символов в исходном ASCII | 256 позиций однобайтной кодировки | 256 позиций однобайтной кодировки | Широкий набор Unicode; UTF-8 использует от 1 до 4 байтов на символ |
| Поддержка русского языка | Нет | Есть | Есть | Есть |
| Способ хранения кода | Один байт на символ | Один байт на символ | Один байт на символ | Переменное число байтов в UTF-8 |
| Совместимость с другими кодировками | Базовые знаки совпадают с началом UTF-8 | Не совпадает с Windows-1251 для ряда кодов | Не совпадает с KOI8-R для ряда кодов | Удобна для обмена, но файл должен читаться как UTF-8 |
| Современное применение | В основном как основа для совместимости | Преимущественно в старых материалах | В основном для поддержки старых файлов и систем | Распространённый формат текстов и веб-страниц |
Сравнивайте не только наличие кириллицы, но и способ хранения: от него зависит, сколько места займёт текст. Если файл отображается неправильно, проверьте, совпадает ли выбранная при чтении кодировка с использованной при сохранении. UTF-8 поддерживает широкий набор символов, но программа всё равно должна правильно определить или получить сведения о кодировке.
Задача 1. По заданной таблице определить числовой и двоичный код символа «A». В таблице указано, что символу «A» соответствует число 65; двоичную запись нужно представить в восьми разрядах. Сначала ищем букву, потому что её код зависит от таблицы, и лишь после этого переводим число в двоичную систему. Решение по шагам:
Ответ: числовой код — 65, двоичный код — 01000001. Для русской буквы действия те же, но сначала надо взять её числовой код из конкретной таблицы: он может отличаться в разных кодировках. Поэтому нельзя переводить в двоичную систему код, не проверив, к какой таблице он относится.
Задача 2. Найти объём строки «Привет» в однобайтной кодировке и UTF-8. Строка содержит шесть русских букв, пробелов и знаков препинания в ней нет. В однобайтной кодировке каждая из этих букв занимает один байт, а в UTF-8 русская буква обычно занимает два байта. Решение по шагам:
Ответ: 6 байт в однобайтной кодировке и 12 байт в UTF-8, если считать только данные символов. Для другого текста нужно проверять состав символов: пробелы, латинские буквы и знаки могут иметь иной размер в UTF-8. Служебные данные файла в этот простой расчёт не включены.
Задача 3. Файл сохранён в Windows-1251, но после открытия текст отображается набором непонятных знаков. Нужно объяснить причину и выбрать способ исправления. Буквы в файле записаны байтами, а программа при чтении должна определить, каким символам эти байты соответствуют. Решение по шагам:
Ответ: вероятная причина — несоответствие кодировки файла и выбранной кодировки чтения. Для просмотра следует указать Windows-1251, а для преобразования — сначала корректно прочитать исходный файл и только потом сохранить в целевом формате. Простая смена обозначения кодировки без преобразования байтов может не исправить текст.
Считать, что один символ всегда занимает один байт. Это верно не для всех способов хранения: в UTF-8 число байтов зависит от символа. Ошибку легко допустить, если помнить только об однобайтных кодировках. Проверяйте тип кодировки и состав строки, прежде чем рассчитывать объём.
Путать числовой код с его двоичной записью. Код — это назначенное символу число, а нули и единицы показывают, как число записано в памяти. Путаница возникает потому, что оба представления относят к одному символу. Для самопроверки подпишите отдельно числовой код и его перевод в двоичную систему.
Считать ASCII полноценной кодировкой русского текста. В исходной таблице ASCII нет кириллических букв, поэтому ею нельзя закодировать обычный русский текст полностью. Ошибка появляется из-за того, что ASCII иногда называют общей таблицей символов. Проверяйте, есть ли в наборе нужные буквы, а не ориентируйтесь только на название.
Объяснять искажённый текст повреждением файла. Часто файл цел, но программа открыла его не в той кодировке, поэтому байты показаны как другие символы. Так происходит, когда кодировку выбирают случайно или программа определяет её неверно. Проверьте исходную кодировку и откройте файл с подходящими настройками, прежде чем считать данные испорченными.
Для понимания темы пригодятся двоичная система счисления, единицы измерения информации и представление данных в памяти: они объясняют, откуда берутся коды и байты. Эти знания применяются при работе с текстовыми файлами, HTML-документами и базами данных, а также при передаче данных по сети. В программировании выбор кодировки влияет на ввод и вывод строк и правильное отображение национальных символов. Если кодировки отправителя и получателя не согласованы, текст может исказиться при обмене.
Почему компьютер не может хранить текст непосредственно в виде букв?
Память компьютера состоит из элементов, которые принимают состояния, условно обозначаемые нулём и единицей. Поэтому символы заранее заменяют числами, а числа записывают в двоичной форме. При чтении компьютер по кодировке восстанавливает символы.
Чем кодировка отличается от кодовой таблицы?
Кодовая таблица показывает соответствие символов и числовых кодов. Кодировка включает правила такого соответствия и то, как коды представляются и хранятся в памяти. Эти понятия связаны, но не тождественны.
Почему русский текст иногда отображается непонятными символами?
Так бывает, если программа читает файл не в той кодировке, в которой его сохранили. Последовательности байтов тогда сопоставляются другим символам. Нужно выбрать подходящую кодировку или преобразовать файл с учётом его исходного формата.
Всегда ли один символ занимает один байт?
Нет. В однобайтной кодировке символ обычно занимает один байт, но набор доступных символов ограничен. В UTF-8 символы могут занимать от одного до четырёх байтов, поэтому размер зависит от конкретного текста.
Зачем нужен Unicode, если существуют национальные кодировки?
Национальные кодировки рассчитаны на ограниченный набор символов, и их соответствия могут различаться. Unicode задаёт общий стандарт для символов разных языков и письменностей. Это упрощает обмен текстом между программами и странами, хотя способ хранения Unicode тоже нужно учитывать.
Представление текстовой информации в компьютере