"Информатика (базовый и углублённый уровень)", Гейн А.Г., Сенокосов А.И.
Компьютер хранит и передаёт текст как последовательность чисел: каждому символу соответствует код из выбранной кодовой таблицы. Чтобы прочитать эти числа как буквы и знаки, программа должна знать подходящую кодировку. Базовый ASCII охватывает прежде всего латиницу и служебные символы, а Unicode предназначен для множества языков и письменностей. При этом код символа и байты, которыми он записан в файле, — разные вещи.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Кодовая таблица — соответствие между символами алфавита и их числовыми кодами. Она нужна потому, что компьютер хранит данные в виде чисел, а не букв; по таблице программа может превратить число в нужный символ и обратно.
Код символа — число, которое таблица ставит в соответствие конкретному символу. Например, код A в ASCII равен 65 в десятичной системе; двоичная запись этого числа — 1000001, то есть способ записать код, а не другой код.
ASCII — кодовая таблица для латинских букв, цифр, знаков препинания и управляющих символов, то есть команд вроде перевода строки. Набор создавался для обмена текстом на английском языке, поэтому его символов недостаточно для записи кириллицы и многих других языков.
Unicode — стандарт, предназначенный для кодирования символов разных языков и письменностей. Он задаёт символам кодовые позиции, но не определяет сам по себе, сколько байтов займёт текст в файле: это зависит от выбранного способа кодирования.
Чтобы представить текст, программа берёт символы по очереди и заменяет каждый соответствующим числовым кодом. Например, слово превращается в цепочку кодов, а затем эти числа записываются в двоичном виде. Такой порядок сохраняет исходную последовательность символов и позволяет компьютеру хранить текст как данные. Обратное преобразование возможно, если при чтении использовать ту же таблицу или совместимое кодирование.
При обмене текстом отправитель и получатель должны одинаково понимать, какие символы обозначают передаваемые данные. Если отправитель записал байты одним способом, а получатель прочитал их по другой таблице, числа могут превратиться в посторонние знаки. Поэтому кодировку указывают в файле или сообщении либо согласуют заранее. Совместимость особенно важна для старых программ и документов, где сведения о кодировке могли не сохраняться.
ASCII содержит ограниченный набор символов, поэтому для кириллицы и других письменностей появились расширенные кодировки. В однобайтовой таблице каждому символу отводится одно из 256 возможных значений, но разные таблицы могли распределять верхние значения по-разному. Это позволяло уместить нужные буквы в байтах, но создавало несовместимость: один файл нельзя было без проверки правильно прочитать в любой системе. Unicode расширил набор кодовых позиций, чтобы охватить символы множества языков.
Число само по себе не указывает, какой символ оно означает: смысл задаёт выбранная кодировка. Например, значение из диапазона расширенной однобайтовой таблицы может обозначать кириллическую букву в одной таблице и другой знак — в другой. Возможна и обратная ситуация: один и тот же символ имеет кодовую позицию Unicode, но записывается разными байтовыми последовательностями в разных форматах. Поэтому при работе с текстом нужно учитывать и таблицу символов, и способ кодирования.
Кодовая позиция в Unicode — это номер символа в общем пространстве кодов, а байтовое представление — конкретные данные, записанные в файле. Например, UTF-8 и UTF-16 кодируют символы Unicode по-разному; число байтов зависит от символа и формата. Нельзя определить размер текста в байтах, просто подсчитав его символы: нужно знать кодирование и состав текста. Это различие помогает понять, почему Unicode не означает, что каждый знак всегда занимает одинаковое место.
| Характеристика | ASCII | Однобайтовая кодировка кириллицы | Unicode |
|---|---|---|---|
| Какие символы охватывает | Латиницу, цифры, знаки препинания и управляющие символы | Латиницу и набор символов, в который обычно входят буквы кириллицы | Символы множества языков и письменностей |
| Размер кодового пространства или способ представления | 128 кодов, обычно записываемых одним байтом | 256 кодовых значений в одном байте | Кодовые позиции Unicode; байтовый размер зависит от формата, например UTF-8 или UTF-16 |
| Как представлены символы кириллицы | Не представлены в базовом наборе | В отдельных позициях конкретной таблицы | Собственными кодовыми позициями |
| Совместимость с другими кодировками | Распространён для базовых латинских символов; расширения могут различаться | Зависит от конкретной таблицы и её совпадения с другой кодировкой | Общие кодовые позиции, но байтовое представление зависит от формата |
| Что происходит при неверном выборе кодировки | Символы вне ASCII могут не отобразиться правильно | Часть текста превращается в чужие знаки или нечитаемые символы | При неверном декодировании байтов текст отображается неправильно |
Сравнивайте прежде всего набор символов и способ их записи: название Unicode ещё не сообщает, каким форматом закодирован файл. Для старых кириллических текстов нужно уточнить конкретную однобайтовую таблицу. Если документ отображается неверно, проверьте кодировку чтения и сравните её с кодировкой сохранения.
Условие. По таблице ASCII найдите числовой и двоичный код символа A. Предположим, в таблице указано десятичное значение 65. Нужно не перепутать числовой код с его записью в другой системе счисления.
Ответ. Числовой код A в ASCII — 65₁₀, его двоичная запись — 1000001₂. Если записывать значение в восьмиразрядном байте, слева добавляют ноль: 01000001. Нули в начале не меняют значение числа.
Условие. В заданной таблице Unicode дана последовательность кодов: 1055, 1088, 1080, 1074, 1077, 1090. Восстановите текст. Здесь числа трактуются как десятичные кодовые позиции Unicode, а не как байты в файле.
Ответ. Получается слово «Привет». Порядок элементов важен, потому что каждый код обозначает очередной символ сообщения. Если сменить таблицу или основание чисел, соответствие нужно проверить заново.
Условие. Один и тот же файл с русским текстом правильно отображается на одном компьютере, но на другом выглядит как набор непонятных знаков. Нужно объяснить причину и предложить исправление. Следует выяснить, как файл сохранили и как его прочитала вторая программа.
Ответ. Вероятная причина — несовпадение кодировок при записи и чтении, а не повреждение букв как таковых. Нужно открыть файл с правильной кодировкой и при необходимости пересохранить его в согласованном формате. Простое переименование файла обычно не меняет его байты и проблему не исправляет.
Считать, что номер символа в таблице всегда уже записан в двоичном виде, — ошибка: число может быть указано в десятичной или другой системе. Так думают, потому что компьютеры используют двоичный код, хотя таблицы часто печатают с десятичными значениями. Проверьте заголовок столбца или условие и подпишите основание числа. Например, 65₁₀ и 1000001₂ — одно значение, но разные записи.
Полагать, что любой числовой код однозначно задаёт символ без названия кодировки, тоже неверно. Причина в том, что разные таблицы могут назначать одному значению разные знаки. Перед расшифровкой выясните, какая таблица использована, и проверьте несколько кодов на соответствие ожидаемому тексту. Если названия кодировки нет, одного числа может быть недостаточно для уверенного ответа.
Нельзя смешивать кодовую позицию Unicode с количеством байтов в файле. Эта путаница возникает из-за того, что оба понятия описывают представление символа, но байты зависят от выбранного формата кодирования. Проверяйте, говорится ли в задаче о номере символа или о размере данных, и уточняйте формат, например UTF-8. Число символов не всегда равно числу байтов.
Базовый ASCII не содержит кодов кириллических букв, хотя русские тексты всё же могли записываться в расширенных однобайтовых таблицах. Ошибку допускают, смешивая ASCII со всеми кодировками, построенными на его основе. Сверьте нужный символ с описанием конкретной таблицы: если требуется русский алфавит, базового набора ASCII недостаточно. Уточните, используется ли расширение или Unicode.
Для работы с кодовыми таблицами нужно уметь переводить целые числа в двоичную систему и знать, что байт состоит из восьми битов. Это помогает читать двоичные представления кодов и оценивать объём данных. Тема связана с представлением текстовой информации: файл хранит не сами буквы, а их закодированные значения. При сохранении и передаче документов, работе с веб-страницами и обмене данными программам требуется согласованная кодировка.
Зачем компьютеру нужна кодовая таблица?
Компьютер работает с числами, а кодовая таблица связывает эти числа с буквами, цифрами и другими символами. Благодаря ей программы могут записывать, передавать и отображать текст.
Почему один и тот же текст может выглядеть нечитаемым в разных программах?
Программа могла прочитать байты файла не в той кодировке, в которой текст сохранили. Тогда числам сопоставляются другие символы; нужно выбрать правильную кодировку или преобразовать файл.
Есть ли в ASCII русские буквы?
В базовом ASCII русских букв нет: набор рассчитан прежде всего на латиницу, цифры, знаки и управляющие символы. Кириллицу добавляли в отдельных расширенных кодировках.
Чем код символа отличается от его двоичной записи?
Код символа — числовое значение, назначенное ему таблицей, например 65 для A в ASCII. Двоичная запись — способ представить это число, например 65₁₀ = 1000001₂.
Означает ли Unicode, что каждый символ занимает одинаковое число байтов?
Нет. Unicode задаёт кодовые позиции символов, а количество байтов зависит от способа кодирования, например UTF-8 или UTF-16. В таких форматах разные символы могут занимать разное число байтов.
§ 13. Кодовые таблицы