Простой Python. Современный стиль программирования (Любанович) - страница 102


Таблица 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.

Вы можете использовать другие кодировки, не только UTF-8, но будете получать ошибки, если строка Unicode не сможет быть обработана другой кодировкой. Например, если вы используете кодировку ascii, у вас ничего не выйдет, если только вы не предоставите строку, состоящую из корректных символов ASCII:

>>>> ds = snowman.encode('ascii')

>Traceback (most recent call last):

>··File "", line 1, in

>UnicodeEncodeError: 'ascii' codec can't encode character '\u2603'

>in position 0: ordinal not in range(128)

Функция encode() принимает второй аргумент, который помогает вам избежать возникновения исключений, связанных с кодировкой. Его значение по умолчанию, как вы можете увидеть в предыдущем примере, равно 'strict'; при таком значении наблюдается исключение UnicodeEncodeError, если встречается символ, не входящий в кодировку ASCII. Существуют и другие кодировки. Используйте значение 'ignore', чтобы опустить все, что не может быть закодировано:

>>>> snowman.encode('ascii', 'ignore')

>b''

Используйте значение 'replace', чтобы заменить неизвестные символы символами?:

>>>> snowman.encode('ascii', 'replace')

>b'?'

Используйте значение 'backslashreplace', чтобы создать строку, содержащую символы Python Unicode вроде unicode-escape:

>>>> snowman.encode('ascii', 'backslashreplace')

>b'\\u2603'

Вы можете использовать этот вариант, если вам нужна печатаемая версия управляющей последовательности Unicode.

В следующем примере создаются строки символьных сущностей, которые вы можете встретить на веб-страницах:

>>>> snowman.encode('ascii', 'xmlcharrefreplace')