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 397
    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 397
    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 397
    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 397
    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 300
    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 300
    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 397
    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 397
    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 300
    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 300
    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 300
    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 300
    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 397
    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 397
    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