Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 139

Вы можете использовать другие кодировки, не только UTF-8, но будете полу-

чать ошибки, если строка Unicode не сможет быть обработана другой кодировкой.

Например, если вы используете кодировку ascii, у вас ничего не выйдет, если

только вы не предоставите строку, состоящую из корректных символов ASCII:

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

Traceback (most recent call last):

File "<stdin>", line 1, in <module>

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

in position 0: ordinal not in range(128)

Функция encode() принимает второй аргумент, который помогает вам избежать

возникновения исключений, связанных с кодировкой. Его значение по умолчанию,

как вы можете увидеть в предыдущем примере, равно 'strict'; при таком значении

186

Глава 7. Работаем с данными профессионально

наблюдается исключение 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')

b'☃'

Декодирование

Мы декодируем байтовые строки в строки Unicode. Когда мы получаем текст из

какого-то внешнего источника (файлы, базы данных, сайты, сетевые API и т. д.),

он закодирован в виде байтовой строки. Идея заключается в том, чтобы знать,

какая кодировка была использована, чтобы мы могли ее декодировать и получить

строку Unicode.

Проблема в следующем: никакая часть байтовой строки не говорит нам о том,

какая была использована кодировка. Я уже упоминал опасности копирования/

вставки с сайтов. Вы, возможно, посещали сайты, содержащие странные символы

в том месте, где должны быть простые символы ASCII.

Создадим строку Unicode, которая называется place и имеет значение 'café':

>>> place = 'caf\u00e9'

>>> place

'café'

>>> type(place)

<class 'str'>

Закодируем ее в формат UTF-8 с помощью переменной bytes, которая называет-