Поддержка Юникода в Python 3.X и инструменты электронной почты

podderzhka junikoda v python 3 x i instrumenty elektronnoj pochty Сценарии на стороне клиента

В предыдущих разделах этой главы мы рассматривали, какое влияние оказывают кодировки Юникода на использование инструментов 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 в версии 3.1 в настоящее время требует, чтобы строки байтов, возвращаемые модулем poplib, были декодированы в строки Юникода str до того, как будут переданы объекту сообщения для анализа. Такое декодирование перед анализом может выполняться по умолчанию, исходя из предпочтений пользователя, содержимого заголовков или иных обоснованных предположений. Поскольку данное требование порождает сложные проблемы для клиентов пакета, оно может быть снято в будущих версиях email и Python.

Пакет email возвращает большинство компонентов сообщений в виде строк str. Однако части сообщений, декодированные с применением Base64 и других схем кодирования электронной почты, могут возвращаться в виде строк bytes. Части, извлекаемые без такого декодирования, могут возвращаться в виде строк str или bytes, при этом некоторые части в виде строк str перед обработкой могут кодироваться внутри пакета в строки bytes с использованием схемы raw-unicode-escape. Заголовки сообщения также могут декодироваться пакетом по запросу.

Если вы переносите свои сценарии электронной почты (или свой образ мышления) с версии 2.X, вам следует интерпретировать текст сообщений электронной почты, получаемых с сервера, как строки байтов и декодировать их перед анализом. Обычно это не касается сценариев, которые составляют и отправляют сообщения электронной почты (это, возможно, подавляющее большинство сценариев на языке Python, поддерживающих электронную почту), однако содержимое сообщений может потребоваться интерпретировать особым образом, если оно может возвращаться в виде строк байтов.

Таково положение дел в Python 3.1, которое, конечно же, может измениться со временем. Далее в этом разделе будет показано, как эти ограничения воплощаются в программном коде. Достаточно сказать, что текст в Интернете уже не так прост, как прежде, хотя, вероятно, он таковым и не должен был быть.

Использованная литература:

Марк Лутц — Программирование на Python, 4-е издание, II том, 2011

Каталог сайтов Всего.ру
Оцените статью
Секреты программирования
Добавить комментарий