Кодирование текста: ASCII и Unicode

Разбираемся, как буквы превращаются в числа: что такое таблица кодировки, чем ASCII отличается от Unicode и сколько весит текст.

Кодировка — это таблица, которая каждому символу ставит в соответствие число (код). По этому числу компьютер хранит и показывает буквы.

Буква — это на самом деле число

В прошлом уроке мы выяснили: внутри компьютера только нули и единицы. Тогда как же он хранит текст этого урока? Ответ: каждой букве заранее присвоили номер, а номер легко записать битами. Договорённость «какой букве какой номер» и есть таблица кодировки.

Это как шифр, о котором все договорились: букве «A» — код 65, букве «B» — 66, и так далее. Главное, чтобы и тот, кто пишет, и тот, кто читает, пользовались одной и той же таблицей. Иначе вместо текста получатся «кракозябры» — наверняка ты такие видел.

ASCII — первая всеобщая таблица

Самая известная старая таблица — ASCII (читается «аски»). В ней 128 символов: латинские буквы (большие и маленькие), цифры, знаки препинания и служебные символы. Каждому хватает 7 бит, а с запасом — 1 байт на символ.

Несколько кодов из ASCII полезно знать:

СимволКод
пробел32
цифра «0»48
буква «A»65
буква «a»97

Заметь хитрость: буквы идут по порядку. «A»=65, «B»=66, «C»=67... Поэтому компьютеру легко сортировать слова по алфавиту — он просто сравнивает коды.

Как сортировка по алфавиту связана с кодами

Тот факт, что буквы в таблице идут по порядку, имеет неожиданно важные последствия. Компьютер не «знает» алфавит так, как знаешь его ты, — он просто сравнивает коды символов как числа. «A» (код 65) меньше «B» (код 66), поэтому при сортировке «Анна» окажется раньше «Бориса». Но тут кроется и ловушка: код заглавной «A» (65) меньше кода строчной «a» (97), и поэтому наивная сортировка поставит «Яблоко» раньше «арбуза», ведь заглавные буквы идут в таблице раньше строчных. Программисты учитывают это особыми приёмами. Запомни главное: для компьютера буквы — это числа, и любые операции с текстом он сводит к сравнению и перестановке чисел.

Unicode — таблица для всех языков мира

В ASCII нет русских букв, нет китайских иероглифов, нет эмодзи. 128 символов — слишком мало для всех языков Земли. Поэтому придумали Unicode (юникод) — огромную таблицу, где есть символы практически всех письменностей мира: больше ста тысяч символов.

На практике Unicode чаще всего записывают способом UTF-8. Он экономный: латинские буквы занимают 1 байт (как в ASCII), а русские буквы и иероглифы — 2 или больше байт. Поэтому русский текст в UTF-8 «весит» примерно вдвое больше, чем такой же по числу букв английский. Это важно помнить, когда считаешь объём файла.

Латинская буква в UTF-8 — 1 байт. Русская буква в UTF-8 — обычно 2 байта.

Попробуй сам

Заглянем в кодировку «вживую»: узнаем код символа, превратим текст в байты и посчитаем его объём. Функция ord() возвращает код символа, chr() — наоборот, символ по коду.

# Код символа и обратно
print("Код буквы A:", ord("A"))
print("Код буквы a:", ord("a"))
print("Символ с кодом 1055:", chr(1055))

# Кодируем русское слово в байты (UTF-8)
slovo = "Привет"
bayty = slovo.encode("utf-8")
print("Слово:", slovo)
print("Байты:", list(bayty))
print("Букв:", len(slovo), " а байт:", len(bayty))

Вывод:

Код буквы A: 65
Код буквы a: 97
Символ с кодом 1055: П
Слово: Привет
Байты: [208, 159, 209, 128, 208, 184, 208, 178, 208, 181, 209, 130]
Букв: 6  а байт: 12

Обрати внимание: в слове «Привет» 6 букв, но 12 байт — потому что каждая русская буква в UTF-8 занимает 2 байта. Поменяй slovo на английское "Hello" и сравни: там букв и байтов поровну. Вот и наглядная разница между латиницей и кириллицей в Unicode.

«Кракозябры»: что это и откуда берутся

Наверняка ты хоть раз видел текст, превратившийся в нечитаемую мешанину символов вроде «РџСЂРёРІРµС‚». Программисты ласково зовут это «кракозябрами», и теперь ты понимаешь их природу. Происходит вот что: текст записали в одной кодировке, а читают в другой. Каждый байт на месте, но таблица для расшифровки взята не та — и компьютер показывает совсем не те символы, как если бы ты читал зашифрованное письмо неправильным ключом. Особенно часто это случалось раньше с русским текстом, ведь для кириллицы существовало несколько разных кодировок (вспомни, в Unicode такой проблемы уже почти нет, потому что он один на всех). Лечится беда просто: нужно открыть текст в правильной кодировке, и буквы встанут на место. Этот пример отлично показывает, почему так важна договорённость о единой таблице: данные те же, а смысл получается разный, если читать их «не по тем правилам».

Как посчитать объём текста

Зная, сколько байт занимает один символ, легко посчитать вес всего текста. Если текст в кодировке, где на символ ровно 1 байт, то текст из 500 символов весит 500 байт. Если каждый символ занимает 2 байта — 1000 байт. Это любимая задача экзамена, и теперь ты знаешь её секрет: объём = число символов × вес одного символа.

Частые ошибки

  • Считать, что 1 буква — всегда 1 байт. В UTF-8 русская буква занимает 2 байта, а эмодзи и того больше.
  • Путать код символа и сам символ. 65 — это код, «A» — символ; их связывает таблица кодировки.
  • Открывать текст не в той кодировке. Тогда вместо букв появляются «кракозябры» — текст закодирован одной таблицей, а читается другой.

Запомни

  • Кодировка — таблица «символ → число»; пишущий и читающий должны пользоваться одной.
  • ASCII содержит 128 символов (латиница, цифры, знаки), по 1 байту.
  • Unicode (UTF-8) охватывает все языки; латиница — 1 байт, кириллица — обычно 2 байта.
  • Объём текста = число символов × вес одного символа.
Проверьте себя
1. Что такое таблица кодировки?
AСписок всех файлов на диске
BСоответствие между символами и их числовыми кодами
CПрограмма для набора текста
DСпособ сжатия картинок
2. Сколько байт обычно занимает русская буква в кодировке UTF-8?
A1 байт
B2 байта
C4 байта
D8 байт
3. Текст из 300 символов записан в кодировке, где каждый символ занимает 1 байт. Каков объём текста?
A300 бит
B300 байт
C2400 байт
D37 байт
4. Почему ASCII не подходит для русского текста?
AASCII слишком новая
BВ ASCII только 128 символов, русских букв там нет
CASCII работает только в интернете
DASCII занимает слишком много места
Поддержать проект