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

Posté par  .
Étiquettes : aucune
0
18
nov.
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 ?
  • # meuh

    Posté par  (site web personnel) . É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  . É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  (site web personnel) . É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  . É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  . É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  (site web personnel) . É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é ...

Suivre le flux des commentaires

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