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 :

[C++] string en unicode ou ansi


Sujet :

C++

  1. #1
    dug
    dug est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Par défaut [C++] string en unicode ou ansi
    Bonjour,

    je vais surement poser des questions bêtes, mais bon, ça arrive à tout le monde

    j'ai un peu de mal de me dépatouiller entre UNICODE et ANSI.

    il n'y a pas un type de donnée string qui gère l'unicode et ansi les doigts dans le nez ?

    std:string ne gère que l'ANSI ?
    si oui, pourquoi il utilise le template _CharT dans leurs fonctions
    si non, pourquoi a été fait std:wstring ...

    et pour wxString, il gère les deux format non ?
    donc on a plus besoin de la macro _T() ?

    bref, un peu embrouillé dans ma tête...

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    j'ai un peu de mal de me dépatouiller entre UNICODE et ANSI.
    Déjà, ce sont des concepts propres à Windows.
    (Il y aussi OEM).

    il n'y a pas un type de donnée string qui gère l'unicode et ansi les doigts dans le nez ?
    Pas en standard.
    Après y'en a dans d'autres bibliothèques oui. (glibmm, ICU...)

    std:string ne gère que l'ANSI ?
    std::string n'a aucune notion de "ANSI".
    C'est une séquence de char.
    Les caractères que peut représenter un char dépendent de la locale système.

    si oui, pourquoi il utilise le template _CharT dans leurs fonctions
    si non, pourquoi a été fait std:wstring ...
    std::wstring est une séquence de wchar_t.
    Pareil, ce qu'est wchar_t dépend de la locale système. Sauf qu'en plus, la taille dépend aussi du système (ce qui n'est pas le cas de char).

    et pour wxString, il gère les deux format non ?
    donc on a plus besoin de la macro _T() ?
    wxwidgets étant multi-plateforme, je ne suis pas certain qu'il applique ce genre de techniques windowsiennes.

    bref, un peu embrouillé dans ma tête...
    Le standard ne fait aucune garantie sur rien du tout.
    L'idéal serait d'avoir du support d'unicode en standard. Un papier récent propose l'ajout de chaînes littérales en utf-8.
    Moi je fais un truc du genre utf8_l("machin truc") pour distinguer les chaînes littérales dans le charset local des chaînes littérales en utf-8.

  3. #3
    dug
    dug est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Par défaut
    merci de ta réponse !

    Après avoir regardé sur ce site, je comprends un peu mieux ce que tu dis

    je compte faire une appli multi-langue (pour la première fois), avec wxWidget.
    Il y a des objets ou librairie externe pour gérer ces problèmatiques ?

  4. #4
    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
    La classe wxString se comporte comme std::string si wxUSE_UNICODE n'est pas défini, ou comme std::wstring sinon.

    Pour une application multi-langues avec wxWidgets :
    - utilise wxString le plus possible
    - utilise wxT("...") pour les chaines constantes ne nécessitant pas de localisation
    - utilise _("...") pour les chaines nécessitant une localisation

    La macro _() va chercher dans le catalogue courant la traduction de la chaine passée en paramêtre. Il suffit donc ensuite de créer un catalogue par langue, avec poEdit par exemple.

  5. #5
    dug
    dug est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Par défaut
    merci de ta réponse Sylvain

    si quelqu'un à sous la main un ptit exemple pour créer un catalogue avec wx, je suis preneur

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par dug
    std:string ne gère que l'ANSI ?
    si oui, pourquoi il utilise le template _CharT dans leurs fonctions
    si non, pourquoi a été fait std:wstring ...
    Si tu regardes de près, tu verras que std::string et std::wstring ne sont que deux instances d'un même template: std::basic_string<>.
    Tu peux même te faire une std::basic_string<TCHAR> si tu en as envie...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    dug
    dug est déconnecté
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    151
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 151
    Par défaut
    Merci de la précision Médinoc

    je n'ai pas encore fouiller les déclarations des std, mais y a surement plein de chose interessante à découvrir

    je suis passé de la programmation sous dos il y a pas mal d'année, au mfc, cbuilder ... à zappant les std dans l'histoire, un comble

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Les CStringT des MFC >= 7 sont pas mal non plus. Elles ont un constructeur pour Ansi et pour Unicode, elles peuvent elles-mêmes être Ansi ou Unicode, font du Copy-On-Write, peuvent passer dans un printf() car leur représentation interne est juste un pointeur sur la chaîne stockée...
    Très sympa, les CStringT...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Et si l'on souhaite convertir un WCHAR* en std::string. Savez-vous quelles solutions existent? Je ne trouve pas grand chose de précis à ce sujet :s

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour moi, les deux solutions principales sont:
    • En MFC, passer par une CStringA
    • En C++ standard, passer par un ostringstream (pas w) et lui injecter le wchar_t *.

    Il existe une troisième solution en C++ standard, avec une fonction membre narrow() dissimulée quelque part (peut-être bien vers string ou char_traits, ou l'équivalent C++ de locale)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    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
    Il existe une troisième solution en C++ standard, avec une fonction membre narrow() dissimulée quelque part (peut-être bien vers string ou char_traits, ou l'équivalent C++ de locale)
    Ca figure dans la prochaine mouture de la FAQ C++, qui devrait ne pas tarder.

  12. #12
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    En fait, il y a une solution dans le style dans la faq, mais je ne suis pas parvenu à la mettre en oeuvre

    J'ai des erreurs étranges et je ne comprends pas grand chose à ce code

    edit: en fait non, ce n'est pas le même problème. La faq dont je donne le lien transforme un std::wstring en std::string. Or moi c'est un WCHAR* que je veux transformer en std::string

  13. #13
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bon, j'ai tenté un truc de bourrin, et ça semble fonctionner:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::string WCharToString(const WCHAR* ws, const unsigned int ws_size)
    {
    	std::string ret;
    	for (unsigned int ui = 0; ui < ws_size; ui++)
    	{
    		ret += (char) ws[ui];
    	}
     
    	return ret;
    }

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Mais ça, ça fonctionne uniquement pour les caractères ISO-8859-1, car ce sont les 256 premiers caractères de l'Unicode.

    Dès que tu cherches à utiliser des caractères autre (par exemple, le symbole Euro devrait montrer l'ereur), ça ne marche plus.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

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

Discussions similaires

  1. String et Unicode
    Par prgasp77 dans le forum Caml
    Réponses: 2
    Dernier message: 30/09/2009, 07h21
  2. [Delphi 2009] TStringField Unicode ou Ansi ?
    Par dergen dans le forum Composants VCL
    Réponses: 0
    Dernier message: 10/04/2009, 18h53
  3. Unicode et Ansi
    Par slam666 dans le forum VB.NET
    Réponses: 2
    Dernier message: 16/11/2008, 22h40
  4. Transformer une String en Unicode
    Par annemarie dans le forum Delphi
    Réponses: 3
    Dernier message: 28/02/2007, 17h43
  5. Convertir un fichier unicode en ansi?
    Par Faiche dans le forum C++
    Réponses: 7
    Dernier message: 06/10/2006, 08h15

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