Я хочу отправлять сообщения электронной почты с произвольными телами Unicode в программе Python 3.2. Но на самом деле эти сообщения будут состоять в основном из 7-битного текста ASCII. Поэтому я хотел бы, чтобы сообщения были закодированы в utf-8 с использованием кавычек-печати. До сих пор я нашел, что это работает, но кажется неправильным:
c = email.charset.Charset('utf-8')
c.body_encoding = email.charset.QP
m = email.message.Message()
m.set_payload("My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1'), c)
Это приводит к сообщению электронной почты с точно правильным содержанием:
To: [email protected]
From: [email protected]
Subject: This is a subjective subject.
MIME-Version: 1.0
Content-Type: text/plain; charset="utf-8"
Content-Transfer-Encoding: quoted-printable
My message with an '=D7=90' in it.
В частности, b'\xd7\x90'.decode('utf-8')
приводит к исходному символу Unicode. Таким образом, кодировка quoted-printable
правильно отображает utf-8
. Я прекрасно понимаю, что это невероятно уродливый хак. Но это работает.
Это Python 3. Ожидается, что текстовые строки всегда будут иметь кодировку Unicode. Мне не нужно было декодировать его в utf-8. А затем превратить его из bytes
обратно в str
с помощью .decode('iso8859-1')
— это ужасный хак, и мне тоже не нужно было этого делать.
Это модуль email
просто сломан в отношении кодировок? Я что-то не получаю?
Я попытался просто установить его без набора символов. Это оставляет мне сообщение электронной почты в формате Unicode, и это совсем не так. Я также пытался пропустить шаги encode
и decode
. Если я оставлю их оба выключенными, он жалуется, что \u05d0
находится вне допустимого диапазона при попытке решить, нужно ли этот символ заключать в кавычки в кодировке для печати в кавычках. Если я ухожу только через encode
шаг, он горько жалуется на то, что я прохожу bytes
, и хочет str
.
"My message with an '\u05d0' in it."
— это юникод, который вам нужен, то вы не можете использовать"My message with an '\u05d0' in it.".encode('utf-8').decode('iso8859-1')
, так как это другой юникод. (Вы изменили сообщение.) - person unutbu   schedule 23.02.2012