Декодировать заголовок электронной почты UTF8
У меня есть почтовый адрес формы:
=?utf-8?B?T3.....?=
Тело письма - это кодировка utf-8 base64 - и декодирована в порядке.
Я использую Perl Email:: MIME модуль для декодирования электронной почты.
В чем смысл разделителя =? utf-8 и как извлечь информацию из этой строки?
Ответы
Ответ 1
encoded-word
токены (согласно RFC 2047) может возникать в значениях некоторых заголовков. Они анализируются следующим образом:
=?<charset>?<encoding>?<data>?=
Charset - это UTF-8, в этом случае кодировка B
, что означает base64 (другая опция Q
, что означает Quoted Printable).
Чтобы прочитать его, сначала декодируйте base64, а затем обработайте его как символы UTF-8.
Также читайте различные RFC-запросы Интернета для более подробной информации, главным образом RFC 2047.
Поскольку вы используете Perl, Encode::MIME::Header может быть полезным:
СИНТАКСИС
use Encode qw/encode decode/;
$utf8 = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);
РЕЗЮМЕ
Этот модуль реализует MFC RFC 2047 Кодирование заголовка. Есть 3 варианта имена кодировок; MIME-заголовок, MIME-B и MIME-Q. Разница описанный ниже
decode() encode()
MIME-Header Both B and Q =?UTF-8?B?....?=
MIME-B B only; Q croaks =?UTF-8?B?....?=
MIME-Q Q only; B croaks =?UTF-8?Q?....?=
Ответ 2
Я думаю, что модуль Encode обрабатывает это с помощью кодировки MIME-Header
, поэтому попробуйте следующее:
use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
Ответ 3
Проверьте RFC2047. "В" означает, что часть между двумя последними "? кодируется base64." Utf-8", естественно, означает, что декодированные данные должны интерпретироваться как UTF-8.
Ответ 4
MIME::Words из MIME-инструментов тоже хорошо работают. Я столкнулся с некоторыми проблемами с Encode и обнаружил, что MIME:: Words преуспел в некоторых строках, где не был Encode.
use MIME::Words qw(:all);
$decoded = decode_mimewords(
'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <[email protected]>',
);
Ответ 5
Это стандартное расширение для маркировки заголовков заголовков, указанное в RFC2047.