>>> place_bytes = place.encode('utf-8')
Текстовые строки
187
>>> place_bytes
b'caf\xc3\xa9'
>>> type(place_bytes)
<class 'bytes'>
Обратите внимание на то, что переменная place_bytes содержит пять байтов.
Первые три похожи на ASCII (преимущество UTF-8), а последние два кодируют
символ «e ' ». Теперь декодируем эту байтовую строку обратно в строку Unicode:
>>> place2 = place_bytes.decode('utf-8')
>>> place2
'café'
Это сработало, поскольку мы закодировали и декодировали строку с помощью
кодировки UTF-8. Что, если бы мы указали декодировать ее с помощью какой-
нибудь другой кодировки?
>>> place3 = place_bytes.decode('ascii')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3:
ordinal not in range(128)
Декодер ASCII сгенерировал исключение, поскольку байтовое значение 0xc3
некорректно в ASCII. Существуют и другие восьмибитные кодировки, где значения
между 128 (80 в шестнадцатеричной системе) и 255 (FF в шестнадцатеричной
системе) корректны, но не совпадают со значениями UTF-8:
>>> place4 = place_bytes.decode('latin-1')
>>> place4
'café'
>>> place5 = place_bytes.decode('windows-1252')
>>> place5
'café'
Ох.
Мораль этой истории — используйте кодировку UTF-8 всюду, где это возмож-
но. Она работает, она поддерживается везде, вы можете с ее помощью выразить
любой символ Unicode и быстро закодировать и декодировать.
Подробная информация
Если вы хотите узнать больше, вам могут помочь следующие ссылки:
Unicode HOWTO (http://bit.ly/unicode-howto);
Pragmatic Unicode (http://bit.ly/pragmatic-uni);
The Absolute Minimum Every Software Developer Absolutely, Positively Must
Know About Unicode and Character Sets (No Excuses!) (http://bit.ly/jspolsky).
188
Глава 7. Работаем с данными профессионально
Формат
До этого момента мы просто игнорировали форматирование текста. В главе 2 были
показаны несколько функций для выравнивания строк, а в примерах кода ис-
пользовалась простая функция print() или даже вывод информации на экран
поручался интерактивному интерпретатору. Но теперь мы рассмотрим, как интер-
полировать данные в строки — другими словами, разместить значения внутри