Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Débuter
Débuter Forum d'entraide pour débuter en langage de programmation C++. Avant de poster : cours d'initiation au C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 12/12/2012, 11h17   #1
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 590
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 590
Points : 7 007
Points : 7 007
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
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 :
Citation:
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 :
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());
    }
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2012, 17h42   #2
Neckara
Rédacteur
 
Avatar de Neckara
 
Homme Denis
Étudiant
Inscription : décembre 2011
Messages : 2 590
Détails du profil
Informations personnelles :
Nom : Homme Denis
Localisation : France, Loire (Rhône Alpes)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : décembre 2011
Messages : 2 590
Points : 7 007
Points : 7 007
Envoyer un message via MSN à Neckara Envoyer un message via Skype™ à Neckara
J'ai trouvé une solution pour convertir string <-> wstring et vice-versa qui marche chez moi même avec les accents :
Code :
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 :
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 :
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;
    }
__________________
Recherche devs C++ motivés et sérieux pour Last Dungeon.

Chaîne Youtube : Vidéos

Ma page DVP : http://neckara.developpez.com/
Neckara est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 21h17.


 
 
 
 
Partenaires

Hébergement Web