Décoder un en-tête de courriel UTF8

j'ai un e-mail sujet de la forme:

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

le corps de l'email est utf-8 base64 encodé - et a décodé fine. Je suis à jour en utilisant le module E-Mail::MIME de Perl pour décoder l'e-mail.

Quelle est la signification du =?délimiteur utf-8 et comment puis-je extraire des informations de cette chaîne?

23
demandé sur Jonathan S. 2008-09-24 12:45:35

5 réponses

encoded-word jetons (comme par RFC 2047) peut apparaître dans les valeurs de certains en-têtes. Ils sont analysés comme suit:

=?<charset>?<encoding>?<data>?=

Charset est UTF-8 dans ce cas, l'encodage est B ce qui signifie base64 (l'autre option est Q ce qui signifie Quoted Printable).

pour le lire, décoder d'abord la base64, puis le traiter comme des caractères UTF-8.

lire aussi les différents RFC de courrier Internet pour plus de détails, principalement RFC 2047.

Puisque vous utilisez Perl, Encoder:: MIME:: Header pourrait être d'utilisation:

SYNOPSIS

use Encode qw/encode decode/;
$utf8   = decode('MIME-Header', $header);
$header = encode('MIME-Header', $utf8);

ABSTRACT

ce module implémente RFC 2047 Mime L'En-Tête De L'Encodage. Il y a 3 variantes noms d'encodage; en-tête MIME, MIME-B et MIME-Q. la différence est décrites ci-dessous

              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?....?=
33
répondu 1800 INFORMATION 2014-08-31 20:32:59

je pense que le module D'encodage gère cela avec le MIME-Header encodage, alors essayez ceci:

use Encode qw(decode);
my $decoded = decode("MIME-Header", $encoded);
17
répondu moritz 2008-09-24 08:57:18

découvrez RFC2047. Le " B " signifie que la partie entre les deux derniers '?'s est base64-encoded. Le 'utf-8' signifie naturellement que les données décodées doivent être interprétées comme UTF-8.

3
répondu marijne 2008-09-24 08:55:50

MIME:: Words de MIME-les outils fonctionnent bien aussi pour cela. J'ai couru dans un problème d'Encoder et de trouvé MIME::Mots réussi sur certaines chaînes où Encoder n'a pas.

use MIME::Words qw(:all);
$decoded = decode_mimewords(
    'To: =?ISO-8859-1?Q?Keld_J=F8rn_Simonsen?= <keld@dkuug.dk>',
);
2
répondu Philonious 2014-08-31 20:43:51

il s'agit d'une extension standard pour l'étiquetage du jeu de caractères des en-têtes, spécifiée dans RFC2047.

1
répondu wnoise 2008-09-24 08:55:55