web-dev-qa-db-fra.com

Comment convertir une chaîne NSString en chaîne std :: string?

J'ai un objet NSString et je souhaite le convertir en un objet std::string.

Comment est-ce que je fais ceci dans Objective-C++?

91
gabor
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 cela a été souligné à juste titre, vous voudrez probablement utiliser cStringUsingEncoding: avec NSASCIIStringEncoding si vous comptez utiliser std::string. Vous pouvez utiliser UTF-8 avec std::strings, mais gardez à l’esprit que ceux-ci fonctionnent sur des octets et non sur des caractères ou même des graphèmes. Pour une bonne "mise en route", regardez ceci question et sa réponse .

Notez également que si vous avez une chaîne qui ne peut pas être représentée par ASCII mais que vous voulez toujours dans un std::string et vous ne voulez pas de caractères non-ASCII, vous pouvez utiliser dataUsingEncoding:allowLossyConversion: pour obtenir une représentation NSData de la chaîne avec le contenu codé avec pertes ASCII), puis jette cette information à votre std::string

126
JustSid

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

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

Comme indiqué sur philjordan.e , il se pourrait également que NSString soit nil. Dans un tel cas, le casting devrait être fait comme ceci:

// NOTE: si foo est nil cela produira une chaîne C++ vide

// 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]);
6
Bruno Bieri