Re: Transformation encodage

Page principale

Répondre à ce message
Auteur: Edgar Bonet
Date:  
À: ML Guilde
Sujet: Re: Transformation encodage
Le vendredi 14 novembre, Frédéric Mantegazza a écrit :
> Je vous avais parle d'un probleme que j'ai avec hypermail. Depuis quelques
> temps, tous les sujets (et uniquement les sujets) des messages archives
> apparaissent dans le genre:
>
>    =?iso-8859-1?Q?Mise au point d=27enceintes?=


Représentation définie dans le RFC 2047 (Message Header Extensions for
Non-ASCII Text) :

    encoded-word = "=?" charset "?" encoding "?" encoded-text "?="


Dans ton exemple :

    - charset = iso-8859-1 ;
    - encoding = Q (c.-à-d. quoted-printable) ;
    - encoded text = Mise au point d=27enceintes


SAUF QUE : tu n'as pas le droit d'avoir des espaces dans un
encoded-word. Donc c'est tout à fait normal que ce ne soit pas décodé :
d'après le RFC ce n'est pas vraiment un encoded-word, et il n'y a donc
rien à décoder. Très vraisemblablement un bogue du mailer utilisé pour
écrire le mail en question.

> Je n'ai pas reussi a trouve d'ou provenait le probleme.


Tu n'as pas réussi à récupérer le mail original pour voir s'il est
véreux ?

> Ce que je voudrais donc faire, c'est passer les pages html a la moulinette
> pour retransformer tout ca correctement. Avant de pondre quelque chose (en
> python, bien sur ;o) ), je voudrais savoir s'il n'existe pas deja un outil
> pour ca ?


J'ai trouvé le package Perl MIME::Head qui permet de décoder les
en-têtes RFC 2047. Regarde en particulier la méthode decode :

http://search.cpan.org/~eryq/MIME-tools-5.411a/lib/MIME/Head.pm#decode

MAIS : Il y a des chances que ça ne marche pas si, comme dans ton
exemple, l'encodage de l'en-tête n'est pas conforme au RFC. Dans ce cas
il faut que tu fasses ta propre fonction de décodage boguée, pour être
bogue-compatible avec le mailer en question.

En Perl je ferais un truc du genre (pas testé) :

# Is this an encoded word?
if (/^(.*) =\? .*? \? (\w) \? (.*?) \?= (.*)$/x) {

    # B encoding means base64
    if ($2 =~ /b/i) { $3 = decode_base64($3); }


    # Q is quoted-printable
    elsif ($2 =~ /q/i) { $3 = decode_qp($3); }


    # Others are unknown
    else { warn "Unknown encoding type $2\n"; }


    # Re-assemble the line
    $_ = "$1$3$4";
}


Edgar.

PS : Ils font vraiment c*** les gens qui programment des mailers sans
avoir lu les RFC avant.

-- 
Edgar Bonet           Maison : 04 76 21 29 16    Bureau : 04 76 88 10 96
3 rue Jean Prévost    Mobile : 06 77 19 79 39    Fax    : 04 76 88 11 91
38000 Grenoble        guilde@???     www.edgar-bonet.org