чать ошибки, если строка 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, которая называет-