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++?
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
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]);
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]);