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?
Répondre
Vous pouvez utiliser la fonction wcstombs.
size_t wcstombs(char * mbstr, const wchar_t * wcstr, size_t max);
Cela m'a permis de franchir la ligne d'arrivée: System :: WideString wstr = "something"; char * buffer = new char [100]; wcstombs (buffer, wstr.data(), 100); merci. – Seth
Cette solution est Windows seulement cependant. –
Oui, les wcstombs C99()/mbstowcs() sont couverts dans d'autres réponses. – Gonzalo
Billy, tout comme le type System :: WideString qui est le sujet de cette question. –
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.
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
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
Convertissez l'inverse, puis comparez. –
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();
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'. –
Avez-vous pensé le contraire? (Convertir le char * en un WideString) –
Eh bien les deux façons serait bon à savoir. Cependant, je préférerais ne pas travailler avec WideString. – Seth
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. –