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++Builder Discussion :

string vers WideString


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 30
    Points : 24
    Points
    24
    Par défaut string vers WideString
    Je voudrais savoir si écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    string s="...";
    WideString ws(s.c_str());
    équivaut à l'utilisation de ::MultiByteToWideChar avec la page de code 1252 ?

    J'ai une fonction string_to_wstring :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::wstring string_to_wstring(unsigned int codePage, std::string const& src) {
    		if(src.size()>0) {
    			int length = ::MultiByteToWideChar( codePage, 0, src.data(), src.size(), NULL, 0 );
    			std::vector<wchar_t> buffer(length);
    			::MultiByteToWideChar( codePage, 0, src.data(), src.length(), &buffer[0], length);
    			return std::wstring(buffer.begin(), buffer.end());
    		}
    		else
    			return std::wstring();
    	}
    Est-ce que le constructeur de WideString réalise la même chose ?
    Merci à vous

  2. #2
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Le type WideString est un type Delphi qui encapsuler l'allocation mémoire des chaines sur le COM
    le classe WideString reprend en C++ les fonctionnalités du type natif WideString du Delphi pour compatibilité avec certains modules comme l'Import de TLB (COM, ActiveX...)

    D'un point de vue conversion char<->wchar_t, c'est la même chose
    D'un point de vue mémoire, c'est fondamentalement différent mais ce n'est pas forcément un problème

    tu utilises la variante constructeur __fastcall WideString(const char* src);Selon la version de Delphi (2009+), le type String est en réalité déjà une encapsulation de wchar_t sous la forme d'une UnicodeString

    Sur les Delphi plus anciens String est un AnsiString

    Ne pas confondre String et std::string, je n'arrive pas bien à comprendre l'utilisation du second dans une application VCL sous C++Builder à part une complexité inutile ou l'utilisation d'une librairie utilisant ce type
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 30
    Points : 24
    Points
    24
    Par défaut
    Pourquoi utiliser std::string ?
    Parce que la partie "interface" de mon application est secondaire.
    Sinon, j'utilise essentiellement la STL, boost, etc...
    Je suis désolé, mais je n'ai pas bien compris ta réponse
    En gros, si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::string x="une chaîne quelconque";
    WideString w(x.c_str());
    1/ est-ce que c'est correct ?
    2/ est-ce que en interne ça correspond à la transformation char => t_wchar
    avec la fonction string_to_wstring que j'ai indiquée ?

  4. #4
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par loubigou Voir le message
    Pourquoi utiliser std::string ?
    Parce que la partie "interface" de mon application est secondaire.
    Sinon, j'utilise essentiellement la STL, boost, etc...
    la STL n'empêche pas l'utilisation des types RTL de C++Builder\Delphi
    Surtout que tu veux utiliser le type WideString qui est justement une partie de la RTL
    Il est fort possible que tu utilises un code plus complexe en STL ou en Boost qu'un code directement orienté RTL\VCL surtout si tu manipules des objets tel que des TDataSet ou tout TObject !

    Citation Envoyé par loubigou Voir le message
    Je suis désolé, mais je n'ai pas bien compris ta réponse
    Pourtant j'ai été clair :
    Citation Envoyé par ShaiLeTroll Voir le message
    D'un point de vue conversion char<->wchar_t, c'est la même chose
    D'un point de vue mémoire, c'est fondamentalement différent mais ce n'est pas forcément un problème

    Citation Envoyé par loubigou Voir le message
    1/ est-ce que c'est correct ?
    Oui

    Citation Envoyé par loubigou Voir le message
    2/ est-ce que en interne ça correspond à la transformation char => t_wchar
    avec la fonction string_to_wstring que j'ai indiquée ?
    Tout dépend ce que l'on appel en interne !
    Oui cela converti mais l'allocation mémoire est différente !
    En plus, il suffit de lire le code de wstring.cpp

    En XE3 :
    C'est très lourd le constructeur de WideString appel WideFromPChar qui
    qui utilise les conversions implicites de Delphi
    les conversions implicites sont gérés par _LStrFromChar\_WStrFromChar qui utilise UnicodeFromLocaleChars
    Ce fonction est conçu pour être multi-plateforme (généricité = complexité)
    Cela appel au final MultiByteToWideChar (Win) ou UnicodeFromLocaleChars (wrapper pour iconv() sous Mac)

    Une fois la conversion faite, cela appel en plus SysAllocStringLen pour copier la chaine wchar_t depuis la mémoire du processus vers la mémoire COM !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. transfert d'une variable string vers rapport RAVE
    Par segnac dans le forum Bases de données
    Réponses: 4
    Dernier message: 30/11/2013, 07h24
  2. String vers byte[]
    Par EpOnYmE187 dans le forum Langage
    Réponses: 8
    Dernier message: 28/10/2011, 11h23
  3. String vers un Double
    Par hugoferd dans le forum Langage
    Réponses: 1
    Dernier message: 16/10/2005, 20h46
  4. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 13h25
  5. [STRING]Contenu d'un String <> vers &lt; et &g
    Par TreizeSegments dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/08/2004, 08h37

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