2009-12-17 21 views
2

J'ai une situation où j'ai besoin de comparer un char* avec un WideString.
Comment puis-je convertir le WideString en un caractère * en C++?Comment puis-je convertir System :: WideString en un char * et vice versa?

+1

Avez-vous pensé le contraire? (Convertir le char * en un WideString) –

+0

Eh bien les deux façons serait bon à savoir. Cependant, je préférerais ne pas travailler avec WideString. – Seth

+0

Peut-être pourriez-vous étirer le type 'char' jusqu'à ce qu'il soit assez large? ;-) Comme le type 'char' est plus petit que le type utilisé pour un * WideString *, la meilleure méthode consiste à convertir le plus petit en plus grand puis à le comparer. –

Répondre

3
+0

Cette solution est Windows seulement cependant. –

+0

Oui, les wcstombs C99()/mbstowcs() sont couverts dans d'autres réponses. – Gonzalo

+0

Billy, tout comme le type System :: WideString qui est le sujet de cette question. –

1

Impossible. En fait, vous avez mélangé deux concepts différents:

  • Widestring implique un tampon en codage UTF-16. Char * peut contenir n'importe quoi, du texte UTF-8 au texte ASCII seulement (dans ce cas, ceci n'est convertible que si votre chaîne large ne contient pas de caractères non-ASCII).

Veuillez voir ma réponse à https://stackoverflow.com/questions/1049947/should-utf-16-be-considered-harmful sur la façon de gérer correctement le texte.

+0

wchar_t est défini pour contenir des données codées UTF-16 uniquement sur Windows. Cela pourrait être différent pour d'autres systèmes d'exploitation. En général, il dépend des paramètres régionaux. – mch

+0

J'ai un composant tiers qui fournit un WideString. Cependant, j'ai besoin de comparer cela avec une chaîne std :: donc si ce n'est pas possible, quelles options ai-je? – Seth

+0

Convertissez l'inverse, puis comparez. –

1

Pour comparer un objet System::WideString avec un char* (comme la question corps dit que vous voulez faire), vous pouvez créer un nouvel objet WideString du pointeur et puis utilisez l'opérateur == ordinaire. La classe a plusieurs constructeurs, dont un pour const char*.

char* foo = ...; 
WideString bar = ...; 
if (WideString(foo) == bar) 
    std::cout << "They're equal!\n"; 

En fait, tant que l'objet WideString est à gauche, vous ne même pas besoin de l'appel du constructeur, car le pointeur sera automatiquement converti.

if (bar == foo) { ... } 

Pour convertir un WideString à un char* (comme la question titre dit que vous voulez faire), vous pouvez envisager d'utiliser le type AnsiString. Ils sont convertibles entre eux. Pour obtenir le pointeur ordinaire, appelez la méthode c_str, comme vous le feriez avec std::string.

WideString bar = ...; 
AnsiString foo = bar; 
std::cout << foo.c_str(); 
+0

A * espace *? Cela ne peut pas être juste. Un caractère nul provoquerait la troncature; Si vous en avez un qui n'est pas à la fin réelle de la chaîne, utilisez la version à deux arguments du constructeur pour pouvoir spécifier la longueur réelle. Un espace peut provoquer une troncature si vous avez quelque chose dans un 'std :: istringstream' et vous lisez une chaîne avec' stream >> stringvar'. –