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

XML Discussion :

Problème avec tinyxml et utf-8


Sujet :

XML

  1. #1
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut Problème avec tinyxml et utf-8
    Bonjour à tous,

    Dans le cadre d'un projet réalisé avec wxWidgets, je voulais gérer les paramètres de mon application dans un fichier xml. wxWidgets ne proposant pas encore de parser (ils déconseillent d'utiliser wxXML), j'ai essayé d'adopter tinyxml.

    Tout avait l'air de fonctionner jusqu'à ce que je mette des accents dans la valeur des attributs... et là, c'est la cata...

    Voici un exemple complet et minimal de code qui expose mon problème :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    #include "tinyxml.h"
    #include <iostream>
     
    int main()
    {
        TiXmlDocument * Doc;
        Doc = new TiXmlDocument();
     
        if(!Doc->LoadFile("test.xml"))
        {
            std::cerr << "Impossible de charger le fichier" << std::endl;
            delete Doc;
            return EXIT_FAILURE;
        }
     
        TiXmlHandle Handle(Doc);
        TiXmlElement * Elt = Handle.FirstChild( "test" ).FirstChild( "noeud" ).Element();
        if(!Elt)
        {
            std::cerr << "Elément noeud non trouvé" << std::endl;
            delete Doc;
            return EXIT_FAILURE;
        }
     
        std::cout << "valeur avant modif : " << Elt->Attribute("valeur") << std::endl;
     
        Elt->SetAttribute("valeur", "testé");
        Doc->SaveFile();
     
        delete Doc;
     
        Doc = new TiXmlDocument();
     
        if(!Doc->LoadFile("test.xml"))
        {
            std::cerr << "Impossible de charger le fichier après modification !" << std::endl;
            delete Doc;
            return EXIT_FAILURE;
        }
     
        Elt = Handle.FirstChild( "test" ).FirstChild( "noeud" ).Element();
        if(!Elt)
        {
            std::cerr << "Elément noeud non trouvé" << std::endl;
            delete Doc;
            return EXIT_FAILURE;
        }
     
        std::cout << "valeur apres modif : " << Elt->Attribute("valeur") << std::endl;
     
        return EXIT_SUCCESS;
    }
    Avant de l'exécuter, il faut placer le fichier "test.xml" dans le répertoire d'exécution, avec pour contenu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?xml version="1.0" encoding="UTF-8" ?>
    <test>
        <noeud valeur="test" />
    </test>
    Et après avoir essayé de changer "test" par "testé", tinyXML n'arrive plus à lire le fichier. Et pour cause, il n'est plus conforme !

    Est-ce que j'ai fait des erreurs dans mon code ?
    Ou est-ce qu'il s'agit d'une erreur de tinyXML (j'ai plutôt tendance à le penser, étant donné que le fichier créé avec tinyXML n'est pas conforme !) ?

    Merci d'avance pour vos réponses !

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    90
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 90
    Points : 100
    Points
    100
    Par défaut
    test.xml n'est pas en UTF-8. Ca peut se voir avec un éditeur hexa : é => C3A9 en UTF-8.

    Je ne m'y connais pas beaucoup en UTF-8 et je ne sais pas si tinyxml propose quelque chose pour faire cela, mais à défaut de mieux, la fonction suivante pourrait t'aider :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    string utf8(unsigned char c) {
    	char s0[] = { c, '\0' };
    	char s1[] = { 0xc2, c, '\0' };
    	char s2[] = { 0xc3, c-0x40, '\0' };
    	if (c<=0x7f) return s0;
    	if (c<=0xbf) return s1;
    	return s2;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
    	/* ... */
    	string s("test" + utf8('é'));
    	Elt->SetAttribute("valeur", s.c_str());
    	/* ... */
    }
    // Maintenant le fichier généré est UTF-8
    Autre solution : il est possible d'ouvrir le xml avec TIXML_ENCODING_LEGACY mais le fichier généré ne sera peut-être pas UTF-8.

  3. #3
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Merci boromir73, je vais voir comment je peux adapter ta fonction.
    Moi qui croyais bêtement que tinyXML gérait ça tout seul :/...

    J'ai essayé hier TIXML_ENCODING_LEGACY, mais ça ne change rien, le fichier est toujours mal encodé.

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Après plusieurs essais, je me suis rendu compte que mon problème venait plutôt de wxWidgets...

    C'est la conversion d'UNICODE vers UTF-8 à partir de la valeur d'un wxTextCtrl qui me pose problème...

    J'ai ouvert un nouveau post sur le forum wxWidgets :
    http://www.developpez.net/forums/sho...88#post1236388

    Merci encore boromir73 !

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Avant de vouloir manipuler un fichier XML apprends à en écrire un de valide.
    ça n'a pas de sens d'avoir des données qui ne sont pas en utf-8 dans un document XML déclaré comme étant encodé en utf-8.

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par loufoque
    Avant de vouloir manipuler un fichier XML apprends à en écrire un de valide.
    ça n'a pas de sens d'avoir des données qui ne sont pas en utf-8 dans un document XML déclaré comme étant encodé en utf-8.
    Tu pourrais être plus agréable dans tes réponses, non ?
    Mis à part cette question de forme, je suis d'accord avec toi, mon problème venait bien d'un mauvais encodage des données. Je savais écrire un fichier xml valide 'manuellement' (même en UTF-8 - manuellement signifiant sans programmation) mais je pensais [bêtement] que tinyXML vérifiait ce qu'il créait aussi... et ne permettait pas de créer un fichier non valide...

    Main bon, mon problème d'encodage ne venait pas de tinyXML mais de wxWidgets, et il est corrigé (voire le post du forum wxWidgets).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Problème de base avec l'encodage UTF-8
    Par TedLun dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 22/10/2014, 13h56
  2. [Encodage] problème avec utf-8
    Par titititiangel dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 16/04/2013, 09h59
  3. [1.x] Problème avec les accents - UTF-8
    Par Laurent001 dans le forum Débuter
    Réponses: 11
    Dernier message: 07/10/2011, 20h33
  4. Encore un problème avec l'UTF-8
    Par Darel dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 18/02/2009, 21h31
  5. [phpBB] Problème avec l'utf-8
    Par vallica dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 11/03/2007, 20h54

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