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++

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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++).
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  3. #3
    Expert éminent

    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
    Points : 7 618
    Points
    7 618
    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
    N'oubliez pas de cliquer sur mais aussi sur si un commentaire vous a été utile !
    Et surtout

  4. #4
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    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
    Points : 13 017
    Points
    13 017
    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
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    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 éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    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
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  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
    Points : 13 017
    Points
    13 017
    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

  9. #9
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Bizarre. Est-ce que tu peux donner
    j'ai le pb aussi quand je compile avec gcc pour une console dos. En revanche, si je redirige la sortie vers un fichier -> OK.

  10. #10
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    1)
    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
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <locale>
     
    using namespace std;
    int main(int argc, char* argv[]){
     
    locale::global(locale(""));
    char* fichier=argv[1];
    FILE* fp = fopen(fichier, "r");
    	if (fp == NULL) // marche pas
    	{
    	cout << "le fichier que vous avez passe en parametre n'existe pas" << endl;
    	}
    	else // ca marche
    	{	
    		ifstream ifs(fichier);
    		string line;
    		getline(ifs,line);
    		cout << line << endl;
    	fclose(fp);
    	}
    return 0;
    }
    le ficheir passé en paramètre est:
    tê tà tï ça tu
    2)
    LANG=fr_FR.UTF-8
    LC_CTYPE="fr_FR.UTF-8"
    LC_NUMERIC="fr_FR.UTF-8"
    LC_TIME="fr_FR.UTF-8"
    LC_COLLATE="fr_FR.UTF-8"
    LC_MONETARY="fr_FR.UTF-8"
    LC_MESSAGES="fr_FR.UTF-8"
    LC_PAPER="fr_FR.UTF-8"
    LC_NAME="fr_FR.UTF-8"
    LC_ADDRESS="fr_FR.UTF-8"
    LC_TELEPHONE="fr_FR.UTF-8"
    LC_MEASUREMENT="fr_FR.UTF-8"
    LC_IDENTIFICATION="fr_FR.UTF-8"
    LC_ALL=


    3)

    0000000 23 69 6e 63 6c 75 64 65 20 3c 76 65 63 74 6f 72
    0000020 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69
    0000040 6e 67 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 69 6f
    0000060 73 74 72 65 61 6d 3e 0a 23 69 6e 63 6c 75 64 65
    0000100 20 3c 66 73 74 72 65 61 6d 3e 0a 23 69 6e 63 6c
    0000120 75 64 65 20 3c 6c 6f 63 61 6c 65 3e 0a 0a 0a 75
    0000140 73 69 6e 67 20 6e 61 6d 65 73 70 61 63 65 20 73
    0000160 74 64 3b 0a 0a 0a 0a 69 6e 74 20 6d 61 69 6e 28
    0000200 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 2a 20
    0000220 61 72 67 76 5b 5d 29 7b 0a 0a 6c 6f 63 61 6c 65
    0000240 3a 3a 67 6c 6f 62 61 6c 28 6c 6f 63 61 6c 65 28
    0000260 22 22 29 29 3b 0a 0a 63 68 61 72 2a 20 66 69 63
    0000300 68 69 65 72 3d 61 72 67 76 5b 31 5d 3b 0a 0a 46
    0000320 49 4c 45 2a 20 66 70 20 3d 20 66 6f 70 65 6e 28
    0000340 66 69 63 68 69 65 72 2c 20 22 72 22 29 3b 0a 09
    0000360 69 66 20 28 66 70 20 3d 3d 20 4e 55 4c 4c 29 20
    0000400 2f 2f 20 6d 61 72 63 68 65 20 70 61 73 0a 09 7b
    0000420 0a 09 63 6f 75 74 20 3c 3c 20 22 6c 65 20 66 69
    0000440 63 68 69 65 72 20 71 75 65 20 76 6f 75 73 20 61
    0000460 76 65 7a 20 70 61 73 73 65 20 65 6e 20 70 61 72
    0000500 61 6d 65 74 72 65 20 6e 27 65 78 69 73 74 65 20
    0000520 70 61 73 22 20 3c 3c 20 65 6e 64 6c 3b 0a 09 7d
    0000540 0a 09 65 6c 73 65 20 2f 2f 20 63 61 20 6d 61 72
    0000560 63 68 65 0a 09 7b 09 0a 09 09 69 66 73 74 72 65
    0000600 61 6d 20 69 66 73 28 66 69 63 68 69 65 72 29 3b
    0000620 0a 09 09 73 74 72 69 6e 67 20 6c 69 6e 65 3b 0a
    0000640 09 09 67 65 74 6c 69 6e 65 28 69 66 73 2c 6c 69
    0000660 6e 65 29 3b 0a 09 09 63 6f 75 74 20 3c 3c 20 6c
    0000700 69 6e 65 20 3c 3c 20 65 6e 64 6c 3b 0a 0a 09 66
    0000720 63 6c 6f 73 65 28 66 70 29 3b 0a 09 7d 0a 0a 0a
    0000740 0a 72 65 74 75 72 6e 20 30 3b 0a 0a 7d 0a
    0000756

    4)
    @ prog mon.cpp | od -t x1

    bash: prog : commande introuvable
    0000000


    j'ai peut être pas bien comprit la 4

    merci de m'aider en tout cas.

    [edit] @3Darchi j'utilise g++ et j'utilise pas une console dos, simplement un bash

    [re-edit] en envoyant l'affichage de mon programme dnas un fichier texte comme tu me la dit, l'affichage est normal. Probleme, mon prog est destiné a être affiché dans un shell donc comment faire pour que l'affichage ne pose pas de problème

  11. #11
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    j'ai par contre ajouté une concaténation de chaine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    else // ca marche
    	{	
    		string jojo ("téstâgë");
    		ifstream ifs(fichier);
    		string line;
    		getline(ifs,line);
    		line+=jojo;
    		cout << line << endl;
     
    	fclose(fp);
    	}
    et là la sortie avec ./a.out mon.txt > out.txt n'est plus normal :

    tê tà tï ça tutéstâgë

  12. #12
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par bak47 Voir le message
    4)
    @ prog mon.cpp | od -t x1

    bash: prog : commande introuvable
    0000000


    j'ai peut être pas bien comprit la 4
    de mes lointains souvenirs unixoïde, prog ça doit correspondre à ton a.out.

  13. #13
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    effectivement, le resultat de 4 est donc

    0000000 23 69 6e 63 6c 75 64 65 20 3c 73 74 72 69 6e 67
    0000020 3e 74 c3 a9 73 74 c3 a2 67 c3 ab 0a
    0000034

  14. #14
    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
    Points : 13 017
    Points
    13 017
    Par défaut
    Si tu enlèves jojo et que tu fais ./a.out mon.txt > out.txt, dans out.txt, c'est OK?
    Je pense que jojo doit poser pb si ton fichier source est enregistré/compilé en ascii.
    [EDIT] : mes souvenirs unixoïde sont comme dit précédemment lointains L'idée de Jean-Marc est de ce que j'en comprend de vérifier que tes paramètres locaux sont cohérents avec l'affichage que tu demande et que les fichiers que tu prends en entrée.

  15. #15
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    ouai, si je fait pas de concaténation ca marche par contre si je peut faire aucun traitement dessus, ca va poser probleme

  16. #16
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Si tu enlèves jojo et que tu fais ./a.out mon.txt > out.txt, dans out.txt, c'est OK?
    Je pense que jojo doit poser pb si ton fichier source est enregistré/compilé en ascii.
    [EDIT] : mes souvenirs unixoïde sont comme dit précédemment lointains L'idée de Jean-Marc est de ce que j'en comprend de vérifier que tes paramètres locaux sont cohérents avec l'affichage que tu demande et que les fichiers que tu prends en entrée.
    Exact. Et fichier etait son fichier de donnee, pas ton fichier source C++. J'ai pas cherche apres les accents dans le fichier C++ pour voir comment ils etaient traites. Est-ce que tu peux refaire les passages dans od avec ton fichier "tê tà tï ça"?
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  17. #17
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Ton fichier source ne doit pas utiliser le même encodage que le fichier que tu lis.

    À vue de nez, tu es en UTF-8 dans ton fichier source, et en iso-8859-1 (15?) dans mon.txt et out.txt

    Pour connaître l'encodage d'un fichier, si tu es sous kde, le plus simple est de l'ouvrir avec kate, et de jouer ensuite avec le paramètre encodage (dans outils), sinon, tu peux jouer avec iconv.

  18. #18
    Futur Membre du Club
    Inscrit en
    Avril 2008
    Messages
    19
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 19
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Exact. Et fichier etait son fichier de donnee, pas ton fichier source C++. J'ai pas cherche apres les accents dans le fichier C++ pour voir comment ils etaient traites. Est-ce que tu peux refaire les passages dans od avec ton fichier "tê tà tï ça"?
    d'accord, je te fait ca bien alors :

    le 3) donne :
    0000000 74 ea 20 74 e0 20 74 ef 20 e7 61 20 74 75 0a 0a
    0000020

    et le 4) si je laisse la concaténation
    0000000 74 ea 20 74 e0 20 74 ef 20 e7 61 20 74 75 74 c3
    0000020 a9 73 74 c3 a2 67 c3 ab 0a
    0000031

    le 4) si je vire la concaténation
    0000000 74 ea 20 74 e0 20 74 ef 20 e7 61 20 74 75 0a
    0000017

    Citation Envoyé par white_tentacle Voir le message
    Ton fichier source ne doit pas utiliser le même encodage que le fichier que tu lis.

    À vue de nez, tu es en UTF-8 dans ton fichier source, et en iso-8859-1 (15?) dans mon.txt et out.txt

    Pour connaître l'encodage d'un fichier, si tu es sous kde, le plus simple est de l'ouvrir avec kate, et de jouer ensuite avec le paramètre encodage (dans outils), sinon, tu peux jouer avec iconv.
    oui deux encodages différent car plus tard dans mon code, j'utilise des caractères que je ne peut pas enregistré en iso-latin1 donc j'ai été obligé de conservé l'UTF-8 pour mon code.
    et mon fichier texte doit pouvoir être encodé dans plusieurs encodage (mais priorité au latin1)

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