один байт для ASCII;
два байта для большинства языков, основанных на латинице (но не кирил-
лице);
три байта для остальных простых языков;
четыре байта для остальных языков, включая некоторые азиатские языки и сим-
волы.
UTF-8 — это стандартная текстовая кодировка для Python, Linux и HTML.
Она охватывает множество символов, работает быстро и хорошо. Если вы исполь-
зуете кодировку UTF-8 в своем коде, жизнь станет гораздо проще, чем в том случае,
если будете скакать от одной кодировки к другой.
Если вы создаете строку Python путем копирования символов из другого источника вроде
веб-страницы и их вставки, убедитесь, что источник был закодирован с помощью UTF-8.
Очень часто может оказаться, что текст был зашифрован с помощью кодировок Latin-1 или
Windows 1252, что при копировании в строку Python вызовет генерацию исключений из-за
некорректной последовательности байтов.
Кодирование
Вы кодируете строку байтами. Первый аргумент строковой функции encode() — это
имя кодировки. Возможные варианты представлены в табл. 7.1.
Текстовые строки
185
Таблица 7.1. Кодировки
ascii
Старая добрая семибитная кодировка ASCII
utf-8
Восьмибитная кодировка переменной длины, самый предпочтительный
вариант в большинстве случаев
latin-1
Также известна как ISO 8859-1
cp-1252
Стандартная кодировка Windows
unicode-escape
Буквенный формат Python Unicode, выглядит как \uxxxx или \Uxxxxxxxx
С помощью кодировки UTF-8 вы можете закодировать все что угодно. При-
своим строку Unicode '\u2603' переменной snowman:
>>> snowman = '\u2603'
snowman — это строка Python Unicode, содержащая один символ независимо от
того, сколько байтов может потребоваться для того, чтобы сохранить ее:
>>> len(snowman)
1
Теперь закодируем этот символ последовательностью байтов:
>>> ds = snowman.encode('utf-8')
Как я упоминал ранее, кодировка UTF-8 имеет переменную длину. В этом случае
было использовано три байта для того, чтобы закодировать один символ snowman:
>>> len(ds)
3
>>> ds
b'\xe2\x98\x83'
Функция len() возвращает число байтов (3), поскольку ds является перемен-
ной bytes.