96 votes

Comment convertir un NSString en std::string ?

J'ai un NSString et que vous voulez le convertir en un objet std::string .

Comment puis-je faire cela en Objective-C++ ?

0 votes

5 votes

@rvalue n'est pas un doublon -- juste la conversion inverse.

141voto

JustSid Points 16366
NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String]);

Edit : Après quelques années, permettez-moi de développer cette réponse. Comme il a été souligné à juste titre, vous voudrez très probablement utiliser cStringUsingEncoding: con NSASCIIStringEncoding si vous devez finir par utiliser std::string . Vous pouvez utiliser UTF-8 avec des std::strings mais gardez à l'esprit qu'ils fonctionnent sur des octets et non sur des caractères ou même des graphèmes. Pour un bon "démarrage", consultez ce qui suit question et sa réponse .

Notez également que si vous avez une chaîne de caractères qui ne peut pas être représentée en ASCII mais que vous voulez quand même la placer dans un fichier de type std::string et que vous ne voulez pas que des caractères non-ASCII y figurent, vous pouvez utiliser dataUsingEncoding:allowLossyConversion: pour obtenir un NSData de la chaîne de caractères avec un contenu ASCII encodé avec perte, puis vous l'envoyez à votre std::string

13 votes

Attention à l'encodage. Si UTF-8 est généralement un bon choix, si l'API avec laquelle vous travaillez attend, par exemple, de l'ASCII pur ou la page de code du système, vous devrez utiliser -cStringUsingEncoding: à la place. :)

13 votes

Il s'agit d'une fuite mémoire si vous ne le supprimez pas, le pointeur retourné n'est pas un objet compté en référence Objective-C. En général, vous devriez éviter d'utiliser l'opérateur new pour std::string.

0 votes

Cela ne devrait pas être la réponse acceptée et certainement pas la première chose à considérer lors de cette conversion.

50voto

Marco83 Points 364

Comme l'a suggéré Ynau dans le commentaire, dans un cas général, il serait préférable de tout garder sur la pile plutôt que sur le tas (en utilisant la fonction new crée la chaîne sur le tas), donc (en supposant un encodage UTF8) :

NSString *foo = @"Foo";
std::string bar([foo UTF8String]);

9voto

viperbone Points 1108

Comme indiqué sur philjordan.eu il se pourrait également que la NSString soit nil . Dans ce cas, la distribution doit se faire comme suit :

// NOTE : si foo est nul, cela produira une chaîne vide en C++.

// au lieu de déréférencer le pointeur NULL de UTF8String.

Cela vous mènerait à une telle conversion :

NSString *foo = @"Foo";
std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X