Faire un don ! | | style | statistiques | contactez-nous | plan | lettre d'information

Retourner aux forums || Retourner au forum Programmation.perl

Programmation.perl : Les mails et le charset windows-1252

Posté par Arnaud (page perso, ) le 18 novembre 2005
Grmpf! Il y a des clients mail windows qui ne suivent pas la RFC 1522 (quelle surprise, me direz-vous), et ça donne des sujets de mail imcompréhensible pour
- le module MIME::WordDecoder de perl
- le logiciel ripmime

Par exemple, voici un extrait de mail reçu:
...
Subject: Avis de =?windows-1252?Q?r=E9ception_d=27un_paiement=5D?=
...

Pour les "=E9", "=27" et "=5D", pas de problèmes, c'est standard. Mais comment gérer le "?windows-1252...", en perl de préférence ?

> Lire le message (6 commentaires, moyenne: 1,5).  

Cette discussion est archivée, il n'est plus possible de laisser des commentaires.

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.

meuh

Posté par gc (page perso, ) le 18/11/2005 à 10:38. (lien). Évalué à 2.

en quoi ca ne respecte pas la RFC ?

[gc@meuh /tmp] echo 'r=E9ception_d=27un_paiement=5D' | perl -pe 's/=(..)/pack("H*", $1)/eg' | iconv -f windows-1252 -t utf8
réception_d'un_paiement]

  • [^]Re: meuh [Résolu ?]

    Posté par Arnaud (page perso, ) le 18/11/2005 à 11:23. (lien). Évalué à 2.

    Le problème, c'est le "?windows-1252?Q?", qui introduit un charset qui n'est pas vraiment standard... Dans un mail MIME, pour spécifier un encoding, on le fait de la forme:
    --8<--8<--8<--8<--8<---
    encoded-word = "=?" charset "?" encoding "?" encoded-text "?="
    --8<--8<--8<--8<--8<---
    (RFC 1522, paragraphe 2)

    On ne peut pas utiliser n'importe quel charset (RFC 1522, paragraphe 2), mais seulement ceux définits dans la RFC 1521:

    --8<--8<--8<--8<--8<---
    charset := "us-ascii"/ "iso-8859-1"/ "iso-8859-2"/ "iso-8859-3"
    / "iso-8859-4"/ "iso-8859-5"/ "iso-8859-6"/ "iso-8859-7"
    / "iso-8859-8" / "iso-8859-9" / extension-token
    --8<--8<--8<--8<--8<---
    (RFC 1521, paragraphe 7.1.2)

    Je pourrais supprimer le "?windows-1252?Q?" en début de sujet et le "?=" en fin de sujet, mais j'aurais alors des problèmes quand il y a différence entre le charset windows-1252 et le charset iso-8859-1 (car le charset Windows contient des symboles particuliers, comme l'euro, le trademark, etc etc). C'est là qu'intervient la combinaison pack+iconv de gc que je ne connaissait point (merci!)

    Donc, ça va donner quelque chose du genre:

    SI le sujet comment par "?windows-1252?Q?" ALORS
      SUPPRIMER en début le "?windows-1252?Q?"
      SI la fin du sujet se termine par "?=" (ça doit!, mais vérifions) ALORS
        SUPPRIMER en fin le "?="
      FIN SI
      Faire la convertion Windows-1252->UTF-8 à a main (pack, iconv)
    SINON
      Utiliser unmime de MIME::WordDecoder
    FIN SI

    • [^]Re: meuh [Résolu ?]

      Posté par gc (page perso, ) le 18/11/2005 à 14:43. (lien). Évalué à 1.

      oh ! alors forcément tu parles de RFC 1522 moi je trouve pas de liste de charsets et puis ensuite tu me dis que la liste est dans la RFC 1521 ! :)

      par contre, avec cette liste, comment faire pour passer le caractère Euro ? avec une telle liste on ne peut pas jeter la pierre à un logiciel voulant passer le caractère euro d'utiliser windows-1252 ou utf-8...

      il est possible que la liste ait été amendée vu l'âge respectable de la RFC mais je n'ai rien trouvé de tel.

      • [^]Re: meuh [Résolu ?]

        Posté par Arnaud (page perso, ) le 18/11/2005 à 16:58. (lien). Évalué à 1.

        C'est vrai que c'est un problème...

        J'ai fait un test avec le caractère Euro (client KMail), le charset utilisé est iso-8859-15. Ça ne respecte pas la RFC, mais au moins, c'est un charset ISO. L'UTF-8 serait la solution, surement, mais peut être pas la meilleur (à quand des mails en XML ? Hélas, jamais)

La soluce "propre"

Posté par Arnaud (page perso, ) le 18/11/2005 à 14:19. (lien). Évalué à 1.

Après deux heures de recherche, j'ai déduis la méthode propre:

#!/usr/bin/perl
use MIME::WordDecoder;
$wd = new MIME::WordDecoder;
$wd->handler('WINDOWS-1252' => "KEEP");
$wd->handler('*' => "KEEP");
$subject = "[Fwd: Avis de =?windows-1252?Q?r=E9ception_d=27un_paiement=5D?=";
print $wd->decode ($subject)."\n";


Voila pour la partie PERL. A présent, je m'attaque à ripmime :-)

un truc utile a connaitre ...

Posté par Moun's (page perso, ) le 19/11/2005 à 10:15. (lien). Évalué à 2.

Encode.pm et Encode::Guess.pm

cela permet de gerer quasiment l'ensemble des merdiers de charset en perl et en prime de pouvoir tenter de deviner comment une chaine est encodé ...

Revenir en haut de page || Retourner aux forums || Retourner au forum Programmation.perl