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 :

Lecture d'un fichier avec des caractères spéciaux


Sujet :

C++

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Lecture d'un fichier avec des caractères spéciaux
    Bonjour,

    Je suis nouveau en c++, et j'ai un sérieux problème ! Je souhaite ouvrir un fichier de texte comprenant sur chaque ligne un mot, et certains mots ont des caractères spéciaux.

    Avant de vous consulter, j'ai consulté la faq, et j'ai vu ce code permettant de passer de l'ASCII a l'Unicode, en convertissant un string en wstring

    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
     
    #include <string> 
    #include <locale> 
    #include <vector> 
     
    std::string narrow(const std::wstring& ws) 
    { 
        std::vector<char> buffer(ws.size()); 
        std::locale loc("english"); 
        std::use_facet< std::ctype<wchar_t> >(loc).narrow(ws.data(), ws.data() + ws.size(), '?', &buffer[0]); 
     
        return std::string(&buffer[0], buffer.size()); 
    } 
     
    std::wstring widen(const std::string& s) 
    { 
        std::vector<wchar_t> buffer(s.size()); 
        std::locale loc("english"); 
        std::use_facet< std::ctype<wchar_t> >(loc).widen(s.data(), s.data() + s.size(), &buffer[0]); 
     
        return std::wstring(&buffer[0], buffer.size()); 
    }
    Mais cela ne fonctionne pas, il n'y a pas de problème de compilation, je lance le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string chaine = "é";
    std::wstring chaine2 = widen(chaine);
    mais en sortie je reçois dans la console :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    terminate called after throwing an instance of 'std::runtime_error'
      what():  locale::facet::_S_create_c_locale name not valid
    Abandon (core dumped)
    Voilà, je n'y connais pas grand chose, j'aimerais savoir si vous pourriez me dépanner ?

    En tout cas, merci à ceux qui auront pris la peine de lire, et plus encore à ceux qui auront répondu.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 153
    Points : 12 264
    Points
    12 264
    Par défaut
    On commence par le début.
    Vous avez des problèmes avec certains caractères car vous lisez ce fichier avec les mauvaises primitives.
    Avant tout bidouillage, il faut connaitre le format exact de votre fichier :
    ASCII (7 bits)
    ASCII - codepage (8 bits) avec des centaines de variantes
    UTF8
    UNICODE avec BOM
    UNICODE sans BOM
    ....

    Si vous ne savez pas, lisez la documentation du logiciel qui générer ce fichier.
    Si c'est pas dans la documentation, c'est que c'est un logiciel de merde.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Alors comme éditeur j'utilise Gedit, apparemment c'est de l'unicode, par contre je n'arrive pas à voir si c'est avec ou sans BOM.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 661
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 661
    Points : 10 642
    Points
    10 642
    Par défaut
    Citation Envoyé par pyrrhus33 Voir le message
    Alors comme éditeur j'utilise Gedit, apparemment c'est de l'unicode, par contre je n'arrive pas à voir si c'est avec ou sans BOM.
    On s'en fiche du BOM pour de l'ASCII, du code page (MBCS) et pour l'UTF-8
    Le BOM sert essentiellement pour savoir si c'est du Big Endian ou du Little Endian (donc pour l'UTF-16 et l'UTF-32)


    locale::facet::_S_create_c_locale name not valid
    Apparemment c'est le nom de la locale qui pose problème : effectivement pour de l'anglais c'est un truc style "en_US"

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    petite précision: certains logiciels produisent de l'UTF-8 avec BOM (le BOM étant utilisé à 90° de la norme pour signaler que le contenu est en UTF). Il faut le savoir pour penser à l'ignorer quand il est présent.

Discussions similaires

  1. Lecture de données avec des caractères spéciaux
    Par Softdaemon dans le forum Administration
    Réponses: 0
    Dernier message: 08/07/2011, 10h27
  2. lecture d'un fichier avec des caractères spéciaux
    Par Invité dans le forum SAS Base
    Réponses: 24
    Dernier message: 20/01/2011, 09h50
  3. Noms de fichiers avec des caractères spéciaux
    Par weabow dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 24/11/2010, 15h51
  4. Copie d'un fichier avec des caractères spéciaux
    Par totofe dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 15/09/2010, 12h28
  5. Réponses: 4
    Dernier message: 04/06/2007, 15h28

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