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 :

Conversion string <-> wstring problème d'accent.


Sujet :

C++

  1. #1
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut Conversion string <-> wstring problème d'accent.
    Bonjour,

    Après avoir lu l'entrée de la FAQ pour convertir des string en wstring (et inversement) j'ai copié-collé le code mais une exception est lancée :
    terminate called after throwing an instance of 'std::runtime_error'
    what(): locale::facet::_S_create_c_locale name not valid
    Au lieu de mettre std::locale loc("english"); par std::locale loc(""); ce qui est censé utiliser la locale par défaut.

    Malheureusement la conversion string <−> wstring rencontre quelques problèmes avec les accents.
    Quand je fait string -> wstring les caractères accentués ne sont pas présents et quand je passe de wstring -> string, les caractères accentués sont remplacé par des '?'.

    Voici mon code actuel :
    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
        std::string IRCClient::narrow(const std::wstring& ws)
        {
            std::vector<char> buffer(ws.size());
            std::locale loc("");
            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 IRCClient::widen(const std::string& s)
        {
            std::vector<wchar_t> buffer(s.size());
            std::locale loc("");
            std::use_facet< std::ctype<wchar_t> >(loc).widen(s.data(), s.data() + s.size(), &buffer[0]);
     
            return std::wstring(&buffer[0], buffer.size());
        }

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 211
    Points
    23 211
    Par défaut
    J'ai trouvé une solution pour convertir string <-> wstring et vice-versa qui marche chez moi même avec les accents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include <locale.h>
    #include <stdio.h>
    #include <stdlib.h>
     
    std::string IRCClient::narrow(const std::wstring& ws)
    {
            char * old = setlocale(LC_ALL, "");
            char buffer[200];
            wcstombs ( buffer, ws.c_str() , sizeof(buffer) );
     
            setlocale(LC_ALL, old);
    }
    Et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::wstring IRCClient::widen(const std::string& s)
    {
            char * old = setlocale(LC_ALL, "");
            wchar_t buffer[500];
            mbstowcs( buffer, s.c_str() , sizeof(buffer) ) != s.size()
            setlocale(LC_ALL, old);
            return buffer;
    }
    Mais comme j'ai remarqué que le protocole que j'utilise ne se base pas sur l'utf-8 mais sur l'ascii étendu, un simple cast à la bourrin suffit :
    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
        std::string IRCClient::narrow(const std::wstring& ws)
        {
            std::string buffer(ws.begin(), ws.end() );
            return buffer;
        }
        std::wstring IRCClient::widen(const std::string& s)
        {
            std::string::const_iterator it = s.begin();
            std::string::const_iterator const end = s.end();
     
            std::wstring buffer;
            buffer.reserve(s.size() );
            for( ; it != end; ++it)
                buffer.push_back( *it > 0? *it: *it + 256 );
            return buffer;
        }

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

Discussions similaires

  1. Problème de conversion String to Date
    Par Nathan_56 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 06/11/2009, 16h39
  2. Problème de conversion String en Double
    Par eighty_three dans le forum Langage
    Réponses: 7
    Dernier message: 19/06/2008, 09h41
  3. Problème de conversion String en Float avec JTable
    Par dumasan dans le forum Composants
    Réponses: 4
    Dernier message: 23/04/2007, 11h56
  4. Problème de conversion string->int
    Par seheiahs dans le forum Langage
    Réponses: 4
    Dernier message: 28/06/2006, 10h42
  5. [D7][Débutant] Problème conversion String <- TEdit
    Par _alex_ dans le forum Composants VCL
    Réponses: 2
    Dernier message: 16/02/2006, 22h48

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