J'ai un NSString
et que vous voulez le convertir en un objet std::string
.
Comment puis-je faire cela en Objective-C++ ?
J'ai un NSString
et que vous voulez le convertir en un objet std::string
.
Comment puis-je faire cela en 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 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
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. :)
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.
Cela ne devrait pas être la réponse acceptée et certainement pas la première chose à considérer lors de cette conversion.
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 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.
0 votes
Duplicata de stackoverflow.com/q/3552195/918764
5 votes
@rvalue n'est pas un doublon -- juste la conversion inverse.