Кодирование текста: 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 байта.
- Объём текста = число символов × вес одного символа.