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 :

_bstr_t en string


Sujet :

C++

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    71
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2014
    Messages : 71
    Points : 47
    Points
    47
    Par défaut _bstr_t en string
    Bonjour à vous !

    Je cherche à convertir un _bstr_t en string pour pouvoir exploiter la chaine de caractère dans d'autres parties de mon projet. Pouvez-vous m'éclairer sur le procédé de conversion?

    Je vous remercie d'avance !

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    En principe c'est aussi simple que ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    _bstr_t bs;
    //remplir bs...
    char const *pstr = bs;
    std::string s(pstr);
    Ou alors tu peux chipoter avec WideCharToMultiByte.

    Ou encore tu adaptes ce code à tes besoins (conversion d'un wstring en string)
    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    std::string wcs2str(std::wstring const & ws)
    {
    	//a try for UTF16 conversion to ANSI (CP1252)
    	std::string s(ws.size(), ' ');
    	std::string::iterator it = s.begin();
    	for (wchar_t wc : ws)
    	{
    		switch (wc)
    		{
    		case 8364: *it = ''; break;
    		//case  129: ''
    		case 8218: *it = ''; break;
    		case  402: *it = 'ƒ'; break;
    		case 8222: *it = ''; break;
    		case 8230: *it = ''; break;
    		case 8224: *it = ''; break;
    		case 8225: *it = ''; break;
    		case  710: *it = 'ˆ'; break;
    		case 8240: *it = ''; break;
    		case  352: *it = 'Š'; break;
    		case 8249: *it = ''; break;
    		case  338: *it = 'Œ'; break;
    		//case  141: ''
    		case  381: *it = 'Ž'; break;
    		//case  143: ''
    		//case  144: ''
    		case 8216: *it = ''; break;
    		case 8217: *it = ''; break;
    		case 8220: *it = ''; break;
    		case 8221: *it = ''; break;
    		case 8226: *it = ''; break;
    		case 8211: *it = ''; break;
    		case 8212: *it = ''; break;
    		case  732: *it = '˜'; break;
    		case 8482: *it = ''; break;
    		case  353: *it = 'š'; break;
    		case 8250: *it = ''; break;
    		case  339: *it = 'œ'; break;
    		//case  157: ''
    		case  382: *it = 'ž'; break;
    		case  376: *it = 'Ÿ'; break;
    		default:
    			if (wc < 256)
    				*it = (unsigned char)wc;
    			else
    				*it = '?';//TODO check U+D800 to U+DFFF surrogate pairs
    		}
    		++it;
    	}
    	return s;
    }

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Et le summum du summum () est d'utiliser les fonctionnalités de <codecvt> après avoir converti le_bstr_t en std::wstring.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <codecvt>
     
    std::wstring ws = ...;
     
    std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>, wchar_t> cvt;
    std::string s = cvt.to_bytes(ws);
    Mais là, il faut potasser la doc du standard car je connais pas trop...

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Le premier code posté par camboui est censé marcher.
    Le second est... intéressant (et n'a pas l'air incorrect).
    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.

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Je vois que la question n'a pas encore été marquée comme résolue...

    J'ajoute donc un lien vers une question semblable à laquelle bacelar et Médinoc ont avantageusement répondu
    convertion-lpwstr-lpcstr/
    Et où je découvre les macros de conversion proposées par ATL

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    Dans un sujet identique
    http://www.developpez.net/forums/d16...s/#post8745660
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::wstring to_string(const std::string& s) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; return converter.from_bytes(s); }
    std::string to_string(const std::wstring& s) { std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter; return converter.to_bytes(s); }
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

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

Discussions similaires

  1. Conversion _bstr_t en system::String^
    Par K3nJi dans le forum C++/CLI
    Réponses: 0
    Dernier message: 08/08/2008, 11h49
  2. éliminer un caractere d'un string
    Par no-vice dans le forum Langage
    Réponses: 5
    Dernier message: 09/08/2002, 14h55
  3. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47
  4. Réponses: 2
    Dernier message: 05/06/2002, 12h29
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 15h23

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