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 :

Conversions Unicode Ascii


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut Conversions Unicode Ascii
    Bonjour,

    Apparemment le code que l'on retrouve là : Comment effectuer les conversions de texte ASCII <-> Unicode ? ne compile pas sous VC8 SP1.

    L'erreur apparait dés la première ligne de chaque fonction, voici la première :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    cannot convert parameter 1 from 'const std::wstring' to 'std::basic_string<_Elem,_Traits,_Ax>::_Has_debug_it'
    A priori ça ressemble a un mauvais copier coller?

    Par ailleurs, est-ce que ce code fonctionnera pour tous les charactères Unicodes (donc tous ceux possibles) ou est-ce qu'il faut changer la locale de manière a ce que ça corresponde? Où se trouvent les définitions des locales?

    Merci de votre attention

  2. #2
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Le code dans la FAQ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    std::string narrow(const std::wstring& ws)
    {
        std::string res(ws);
        std::locale loc("english");
        std::use_facet< std::ctype<wchar_t> >(loc).narrow(&ws[0], &ws[ws.length()], '?', &res[0]);
     
        return res;
    }
    a au moins trois erreurs :

    1) std::string res(ws); n'est pas valide
    2) &ws[ws.length()] n'est pas valide
    3) &res[0] ne retourne pas forcement un pointeur vers les caractères de la chaine

    Il faudrait le remplacer par quelque chose comme ça
    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
    #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());
    }

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    On va corriger ça, merci

  4. #4
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Merci pour la correction, je vais tester ça de suite.

    En attendant je réitère mes questions :

    Par ailleurs, est-ce que ce code fonctionnera pour tous les charactères Unicodes (donc tous ceux possibles) ou est-ce qu'il faut changer la locale de manière a ce que ça corresponde? Où se trouvent les définitions des locales?

  5. #5
    Membre Expert
    Avatar de Klaim
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Août 2004
    Messages
    1 717
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 717
    Par défaut
    Comme je m'en doutais, le code de la FAQ ne marche pas dans tous les cas.

    Je l'ai proposé sur le forume de Ogre : http://www.ogre3d.org/phpBB2/viewtop...=230609#230609

    Voici une variante avec test proposée dans le thread :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    #include "stdafx.h"
    #include <string>
    #include <locale>
    #include <stdlib.h>
     
    using namespace std;
     
    wstring toWideString(const string &str)
    {
       size_t size = mbstowcs(NULL, str.c_str(), 0) + 1;
       wchar_t *wmsg = new wchar_t[size];
       mbstowcs(wmsg, str.c_str(), size);
       wstring ret(wmsg);
       delete wmsg;
       return ret;
    }
     
     
    string toString(const wstring &wstr)
    {
       size_t size = wcstombs(NULL, wstr.c_str(), 0) + 1;
       char *msg = new char[size];
       wcstombs(msg, wstr.c_str(), size);
       string ret(msg);
       delete msg;
       return ret;
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
       string hello("Hello World!");
       wstring hellow = toWideString(hello);
     
       wstring byew(L"Goodbye!");
       string bye = toString(byew);
       return 0;
    }

    Pourrais-je avoir votre avis là dessus ? Je capte pas tout au niveau du jonglage avec les locales pour l'instant...

  6. #6
    Membre expérimenté
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Par défaut
    Tiens ? Je n'avais même pas remarqué que mon code était dans la FAQ...
    Il ne correspond cependant pas tout à fait à ce que j'avais proposé... Il faut remplacer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string s(ws) ;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string s;
    s.resize(ws.length()) ;
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::string ws(s) ;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::string ws ;
    ws.resize(s.length()) ;
    Le but est simplement de construire une chaine du bon type et avec la bonne taille. Peut importe ce qu'il y a dedant

    Par contre, je ne vois pas en quoi l'utilisation de l'opérateur [] est une erreur... Quelqu'un peut m'eclairer ? Il y a peutetre une subtilité qui m'échape

Discussions similaires

  1. Réponses: 13
    Dernier message: 16/09/2014, 12h59
  2. conversion UNICODE -> ASCII
    Par juniorAl dans le forum C#
    Réponses: 5
    Dernier message: 19/05/2010, 23h09
  3. Conversion de ASCII vers Unicode
    Par Arnaud F. dans le forum Langage SQL
    Réponses: 5
    Dernier message: 15/10/2008, 15h48
  4. Conversion Texte ASCII -> Unicode
    Par lesouriciergris dans le forum C++
    Réponses: 6
    Dernier message: 26/04/2006, 20h43
  5. conversion Unicode -> ASCII
    Par juzam dans le forum C
    Réponses: 8
    Dernier message: 24/07/2003, 10h07

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