IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Modules Perl Discussion :

XML::Parser et les accents


Sujet :

Modules Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 14
    Par défaut XML::Parser et les accents
    Salut

    J'ai un problème avec XML::Parser pour parser un fichier UTF-8. Dans le fichier, 'encoding="UTF-8"' est bien présent dans l'entete ET un caractère "é" encodé en utf-8 est malicieusement glissé dans le texte (testé avec un éditeur hexa (C3 A9) + on voit dans "é" avec notepad).

    LECTURE du fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    my $plain_xml;
    if( open(FILE, "<options.xml") ) {
      $plain_xml=<FILE>;
      close FILE;
    }
    print Dumper($plain_xml);
     
    RESULTAT :
    ... Test\x{c3}\x{a9} ...
     
     
    LECTURE avec XML::Parser :
    use XML::Parser;
    use XML::Parser::EasyTree;
    my $hash_xml = new XML::Parser(Style=>'EasyTree')->parsefile( 'options.xml' );
    print Dumper($hash_xml);
     
    RESULTAT:
    ... Test\x{e9} ...
    mon "é" a été encodé en ISO par XML::Parser ?
    pourquoi ?

  2. #2
    Membre confirmé
    Inscrit en
    Mai 2007
    Messages
    149
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 149
    Par défaut
    tu devrais essayer de remplacer tout tes caractères accentués par leur équivalent en Hexa. Je recontre le même problème en php actuellement.

  3. #3
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    A mon avis, ton é n'a pas été encodé en latin1 par XML::Parser, bien au contraire !
    C'est simplement que ton terminal est configuré avec l'encodage latin1 en sortie, et qu'ainsi une chaîne de caractère marqué comme de l'utf-8 sera traduite vers latin1 lorsqu'elle est envoyée sur ce terminal.
    Le fait que dans ton premier exemple il n'y ait pas eu traduction montre seulement que la lecture s'est faite en mode texte "sans encodage" par défaut, et que Perl a donc lu bit par bit, et produit une chaîne qui n'était pas marqué unicode, il n'y a donc pas eu de traduction en sortie par la suite.
    Essaie le code suivant pour vérifier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $plain_xml;
    if( open(FILE, '<:utf8', 'options.xml') ) {
      $plain_xml=<FILE>;
      close FILE;
    }
    print Dumper($plain_xml);
    Tu devrais voir un é en latin1 en sortie, car la chaîne contenue par $plain_xml est maintenant marqué unicode. (évidemment tu te serais plus vite aperçu du problème si tu avais eu un caractère unicode vraiment étranger dans ton document XML, dans le premier cas (open...) il t'aurais simplement sorti une suite de bits, dans le second (XML::Parser) il t'aurait avertit que tu avais des "wide characters in print" ce qui t'aurais sans doute mis la puce à l'oreille sur le fait que dans le second cas il stockait vraiment des chaînes en unicode)

    En bref le comportement de XML::Parser est correct, c'est simplement la façon dont tu l'as examiné qui t'en fait douter.

    --
    Jedaï

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 14
    Par défaut
    D'accord !
    Je comprend bien effectivement le fait que les chaines soient marquées unicode par XML::Parser, et donc qu'elles apparaissent "traduites".
    Merci pour l'explication.

    Sais-tu dans ce cas comment faire pour que tout le travail se fasse en utf8 ? Ou du moins, pour ne pas à avoir à ré-encoder en utf8 tout ce que je lis avec XML::Parser avant de l'envoyer dans un fichier.

    Voici les seules variables d'environement que j'ai trouvé concernant l'encodage de la session de l'utilisateur que j'utilise :

    LANG=fr_FR.UTF-8
    SUPPORTED=fr_FR.UTF-8:fr_FR:fr

    Je suppose que c'est un de ces paramètres qui gère dicte l'encodage à utiliser... pourtant j'ai beau essayer plusieurs combinaisons, ça ne change rien.

    Ou alors peut-être faut-il ajouter une autre variable d'environement ?

  5. #5
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    Tout le travail se fait déjà en utf8, par contre ce qui ne se fait probablement pas en uf8 c'est l'écriture dans le fichier.

    Essaie d'ouvrir le fichier de sortie avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    my $filename =  'fichier_de_sortie.xml';
    open my($out), '>:utf8', $filename
      or die "Couldn't open $filename : $!\n";
    Si tu veux toujours travailler en utf8 dans ton script et que tu ne veux pas avoir à te poser de question, tu peux aussi utiliser le pragma 'open'.

    --
    Jedaï

Discussions similaires

  1. [XML] Problème avec les accents
    Par padrone dans le forum MXML
    Réponses: 4
    Dernier message: 06/10/2009, 13h47
  2. Les accents dans xml!
    Par ncityfr dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 20/09/2009, 23h23
  3. Problème avec les accents sous xml.
    Par simplyme dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 11/07/2009, 19h52
  4. [WD10] XML et les accents
    Par mnssylvain dans le forum WinDev
    Réponses: 1
    Dernier message: 29/04/2009, 00h34
  5. [SimpleXML] Problème avec les accents dans le XML
    Par trotters213 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 18/12/2006, 10h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo