В предыдущих разделах этой главы мы рассматривали, какое влияние оказывают кодировки Юникода на использование инструментов FTP из модуля ftplib, потому что это иллюстрирует влияние модели строк Юникода в Python 3.X на практическое программирование. Вкратце:
• Для двоичных режимов передачи локальные входные и выходные файлы должны открываться в двоичном режиме (режимы wb и rb).
• При загрузке в текстовом режиме локальные выходные файлы должны открываться в текстовом режиме с явным указанием кодировки (режим w, с аргументом encoding, который по умолчанию принимает значение latin1 в модуле ftplib).
• При выгрузке в текстовом режиме локальные входные файлы должны открываться в двоичном режиме (режим rb).
Мы уже выясняли, почему следует неукоснительно следовать этим правилам. Последние два пункта в этом списке отличаются для сценариев, изначально написанных для работы под управлением Python 2.X. Как вы уже наверняка догадались, учитывая, что данные через сокеты передаются в виде строк байтов, работа с электронной почтой также осложняется из-за особенностей поддержки Юникода в Python 3.X. В качестве предварительного знакомства:
Получение
Модуль poplib возвращает полученное сообщение электронной почты в виде строки bytes. Текст команд кодируется внутри модуля и передается серверу в кодировке UTF8, но ответы возвращаются как простые строки bytes, а не как декодированный текст str.
Отправка
Модуль smtplib принимает сообщение электронной почты для отправки в виде строки str. Перед передачей, внутри модуля, текст str кодируется в двоичное представление bytes с использованием схемы кодирования ascii. Имеется возможность передачи методу отправки уже закодированной строки bytes, что обеспечивает более явное управление кодированием.
Составление
При создании сообщений электронной почты, готовых к отправке с помощью модуля smtplib, пакет email воспроизводит строки str Юникода, содержащие простой текст, и принимает необязательные указания о кодировках для сообщений и их частей, которые будут применяться в соответствии со стандартами электронной почты. Заголовки сообщений также могут кодироваться в соответствии с соглашениями электронной почты, MIME и Юникода.
Анализ
Навигация
Пакет email возвращает большинство компонентов сообщений в виде строк str. Однако части сообщений, декодированные с применением Base64 и других схем кодирования электронной почты, могут возвращаться в виде строк bytes. Части, извлекаемые без такого декодирования, могут возвращаться в виде строк str или bytes, при этом некоторые части в виде строк str перед обработкой могут кодироваться внутри пакета в строки bytes с использованием схемы raw-unicode-escape. Заголовки сообщения также могут декодироваться пакетом по запросу.
Если вы переносите свои сценарии электронной почты (или свой образ мышления) с версии 2.X, вам следует интерпретировать текст сообщений электронной почты, получаемых с сервера, как строки байтов и декодировать их перед анализом. Обычно это не касается сценариев, которые составляют и отправляют сообщения электронной почты (это, возможно, подавляющее большинство сценариев на языке Python, поддерживающих электронную почту), однако содержимое сообщений может потребоваться интерпретировать особым образом, если оно может возвращаться в виде строк байтов.
Таково положение дел в Python 3.1, которое, конечно же, может измениться со временем. Далее в этом разделе будет показано, как эти ограничения воплощаются в программном коде. Достаточно сказать, что текст в Интернете уже не так прост, как прежде, хотя, вероятно, он таковым и не должен был быть.
Использованная литература:
Марк Лутц — Программирование на Python, 4-е издание, II том, 2011