Подтвердить что ты не робот

Декодировать заголовок электронной почты UTF8

У меня есть почтовый адрес формы:

=?utf-8?B?T3.....?=

Тело письма - это кодировка utf-8 base64 - и декодирована в порядке. Я использую Perl Email:: MIME модуль для декодирования электронной почты.

В чем смысл разделителя =? utf-8 и как извлечь информацию из этой строки?

4b9b3361

Ответ 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.