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

C++ Discussion :

récupération de caractères accentués contenus dans un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Par défaut récupération de caractères accentués contenus dans un fichier
    bonjour, j'ai trouvé plusieurs post traitant du sujet mais je n'ai pas réussit à avoir une réponse à ma question.

    voila ma situation: je dispose d'un fichier texte (pour le moment, je travail uniquement sur du latin1 mais à terme mon prog doit être capable de supporté plusieurs autres encodage dont l'UTF-8) contenant toute une liste de mots donc certain sont accentué.

    la première étape de mon programme consiste a récupérer les chaines de caractères contenuent dans mon fichier

    Problème : quand il y a des accent, ils sont remplacés par un magnifique � qui me bloque totalement car j'ai besoin des accents pour les traitements ultérieurs

    si vous avez des solution, je suis prneur. j'ai esseyé avec getLine et fgetc et le résultat est le même.

    je travail sous différent linux et avec g++ comme compilateur

  2. #2
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include <locale>
     
    int main()
    {
       std::locale::global(std::locale(""));
       ...
    }
    Et il faut indiquer correctement la locale a utiliser (variables d'environnement LC_xxx).

    Il vaut mieux utiliser des wchar_t, wstring, wiostream etc si ton programme doit fonctionner avec des locales UTF-8.

    Si tu dois faire fonctionner ton programme avec tes fichiers qui sont dans un autre charset que ton terminal, ca devient en toute rigueur beaucoup plus delicat. Mais sous Linux ca devrait passer simplement en imbuant (membre imbue des iostreams) des locales adequates dans les fichiers (sous Linux wchar_t devrait toujours etre de l'Unicode en UCS-32 dans toutes les locales, mais ce n'est pas garanti par la norme C++).

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par bak47 Voir le message
    Problème : quand il y a des accent, ils sont remplacés par un magnifique � qui me bloque totalement car j'ai besoin des accents pour les traitements ultérieurs
    Déjà, ça, ça me gène.... un caractère accentué n'est *jamais* remplacé par � à la lecture...
    Le fichier (ou une 'chaine de caractères') n'est qu'une suite d'octets... Qui sont affiché par un programme comme un caractère accentué, et par un autre programme (par exemple le debugueur) comme un �

    Il faut donc spécifier à l'affichage, comment gérer ces données.

    Un fichier texte ne contient pas d'information d'encodage par défaut... Les fichiers XML oui, les fichier HTML non (l'encodage est fourni dans les headers du serveur). Il faudra donc laisser le soin à l'utilisateur de choisir l'encodage idéal (rien que pour choisir entre les ISO-8859 c'est pas facile ! ).
    Ensuite, la lecture n'est pas à refaire, elle ne change rien à la donnée (une suite d'octets), c'est uniquement la manière dont on l'interprete qui change.

    La locale n'y change pas grand chose hélas.... rien n'interdit de lire un fichier UTF-8 avec une locale qui utilise l'ISO-8859-1

  4. #4
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Par défaut
    désolé de mon delais de réponse, j'ai été coupé du net pendant quelques jours.

    tout d'abbord, merci d'avoir prit le temps de me répondre.

    Déjà, ça, ça me gène.... un caractère accentué n'est *jamais* remplacé par � à la lecture...
    effectivement, à la lecture il n'y a pas de soucis, si je récupère mon texte et que je fait ensuite un test tel que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(line[i]=='ê'){cout << "ok"<< endl;}
    aucun probleme, le teste passe bien.

    par contre si je fait un simple

    ca m'affiche le �. Si quelqu'un voit une solution à c eproblème, je suis preneur.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Comme dit plus haut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <locale>
     
    int main()
    {
       std::locale::global(std::locale(""));
       ...
    }

  6. #6
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Par défaut
    peut tu m'éclairé sur le fonctionnement des locale?

    j'ai fait ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    locale::global(locale(""));
     
    char* fichier=argv[1];
    FILE* fp = fopen(fichier, "r");	
    ifstream ifs(fichier);
    string line;
    getline(ifs,line);
    cout << line << endl;
    avec dans mon fichier :
    tê tà tï ça tu
    et le résultat reste le même :
    t� t� t� �a tu

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Bizarre. Est-ce que tu peux donner
    1/ ton programme de test complet
    2/ le resultat de la commande
    locale
    dans le terminal ou tu lances ton programme
    3/ le resultat de la commande
    od -t x1 fichier
    avec fichier qui est le fichier source
    4/ le resultat de
    prog fichier | od -t x1

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Tu es sous gcc ?
    Essais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mon_prog.exe > out.txt

Discussions similaires

  1. Récupération de données pour mettre dans un fichier .txt
    Par lince102 dans le forum Interfaces Graphiques
    Réponses: 10
    Dernier message: 24/01/2008, 11h29
  2. Extraire les pilotes contenus dans un fichier .exe
    Par DM111 dans le forum Windows XP
    Réponses: 6
    Dernier message: 10/06/2007, 22h49
  3. Remplacé des caractères UTF8 erronés dans plusieurs fichiers
    Par evaisse dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 31/03/2007, 23h18
  4. Addition de nombres contenus dans un fichier
    Par Krispy dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 15/12/2006, 17h04
  5. Réponses: 3
    Dernier message: 14/04/2006, 19h47

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