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

GTK+ avec C & C++ Discussion :

Gtkmm: problème encodage utf-8


Sujet :

GTK+ avec C & C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut Gtkmm: problème encodage utf-8
    Bonjour tout le monde,

    J'ai pas beaucoup d'expérience pour les encodages. Pour expérimenter, j'ai écrit le code suivant:

    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
     
    #include <giomm.h>
    #include <iostream>
    #include <glibmm.h>
    #include <string>
    int main(int argc, char** argv)
    {
        Glib::init();
        Gio::init();
        if(argc!=2) return 1;
    //open a file to read
        Glib::RefPtr<Gio::File> file=Gio::File::create_for_path(argv[1]);
        Glib::RefPtr<Gio::DataInputStream> fin=Gio::DataInputStream::create(file->read());
        std::string line;
    //try to read.
        try{
            int i=1;
            while(fin->read_line(line)){
                std::cout<<i<<": tel-quel: \""
                            <<line<<"\""<<std::endl;
                std::cout<<i<<": avec Glib::ustring: \""
                            <<Glib::ustring(line)<<"\""<<std::endl;
                ++i;
            }
        } catch(Glib::ConvertError error){
            std::cout<<std::endl<<"Glib::ConvertError: "<<error.what()<<std::endl;
        }
        return 0;
    }
    Si je donne à ce programme le fichier suivant encodé en utf-8:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    First line: plain text.
    deuxième ligne: des accents ici et là...
    ça donne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    1: tel-quel: "First line: plain text."
    1: avec Glib::ustring: "First line: plain text."
    2: tel-quel: "deuxième ligne: des accents ici et là..."
    2: avec Glib::ustring: "
    Glib::ConvertError: Invalid byte sequence in conversion input
    mon "locale" (sous linux) utilise l'utf-8 (fr_CH), c'est pour ça que la sortie
    console toute simple avec des std::string fonctionne sans problèmes.

    La question est: Comment importer le contenu d'un fichier (encodage quelconque mais connu à l'avance) dans un ustring?

    Je développe une application pour jouer au go, les caractères asiatiques doivent absolument être pris en charge...

    Merci

    Bastien

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 259
    Par défaut
    Es-tu absolument certain que ton fichier d'entrée est encodé en UTF-8 ? Ca pourrait expliquer

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    Oui oui, avec gedit je spécifie l'encodage avant d'enregistrer.
    C'est aussi pour cette raison que le terminal interprète correctement les caractères quand ils sont passés en std::string. Si je traitais le string entrant directement, je pense que j'aurais des problème puisque certains caractères seront stockés sur 1, 2, 3, ou 4 bytes...

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Par défaut
    C'est bon j'ai compris

    Lorsqu'on utilise des std::ostream, les Glib::ustring font une conversion vers la locale qui échoue (pourquoi?).
    ça marche en utilisant ustring::raw() qui renvoie un std::string. Dans ce string par contre, un charactère peut être représenté par plusieurs bytes donc en utilisant std::string::operator[], on risque de se retrouver "au milieu" d'un charactère. Mon terminal arrive apparemment à interpréter le flux correctement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Glib::ustring str("un string avec des accents àéèàé");
    cout<<str.raw()<<endl;
    fonctionne.
    utiliser un std::ostream pour écrire dans un fichier de cette manière résulterait en un fichier écrit en utf-8.

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

Discussions similaires

  1. Problème Encodage UTF-8
    Par oum87 dans le forum Général Java
    Réponses: 1
    Dernier message: 19/09/2012, 20h40
  2. [MySQL] Problème encodage UTF
    Par PIEPLU dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 29/02/2012, 22h20
  3. Problème encodage utf-8
    Par dorian53 dans le forum NetBeans
    Réponses: 1
    Dernier message: 17/01/2011, 14h43
  4. Problème Encodage UTF-8
    Par ilandril dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/12/2009, 12h29
  5. Réponses: 3
    Dernier message: 12/11/2007, 14h55

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