111 votes

Comment convertir std::string en NSString ?

Bonjour, j'essaie de convertir une chaîne standard std::string en une NSString mais je n'ai pas beaucoup de chance.

Je peux convertir avec succès une NSString en une std::string avec le code suivant

NSString *realm = "Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];

Cependant, j'obtiens une erreur de compilation lorsque j'essaie ce qui suit

NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];

L'erreur que j'obtiens est

Cannot convert 'std::string' to 'const char*' in argument passing

Est-ce que je rate quelque chose ici ?

Merci d'avance.

125voto

Vladimir Points 110327

Obtenir une chaîne de caractères c à partir de std::string pour la conversion :

NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                   encoding:[NSString defaultCStringEncoding]];

58voto

rvalue Points 945

Tout d'abord, vous devez utiliser Objective-C++ pour que cela fonctionne le moins du monde ; le moyen le plus simple de s'en assurer est de renommer tous vos fichiers *.m pour *.mm

C'est de loin la méthode manuelle la plus utilisable (non dépréciée) pour obtenir un code C++. std::string dans un NSString est avec :

std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];

Cela fonctionnera dans la plupart des cas - et si vous ne faites pas de détection et de conversion d'encodage spécifiques, UTF-8 vous donnera un bon résultat pour que les caractères non latins " fonctionnent ".

En revanche, si vous réalisez une application plus importante ou si vous n'êtes pas le seul à travailler dessus, vous voudrez probablement quelque chose de plus facile à appliquer.

Adapté de archives de la liste de diffusion cocoa-dev

@interface NSString (cppstring_additions)
+(NSString*) stringWithwstring:(const std::wstring&)string;
+(NSString*) stringWithstring:(const std::string&)string;
-(std::wstring) getwstring;
-(std::string) getstring;
@end

@implementation NSString (cppstring_additions)

#if TARGET_RT_BIG_ENDIAN
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32BE);
#else
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
#endif

+(NSString*) stringWithwstring:(const std::wstring&)ws
{
    char* data = (char*)ws.data();
    unsigned size = ws.size() * sizeof(wchar_t);

    NSString* result = [[NSString alloc] initWithBytes:data length:size encoding:kEncoding_wchar_t];
    return result;
}
+(NSString*) stringWithstring:(const std::string&)s
{
    NSString* result = [[NSString alloc] initWithUTF8String:s.c_str()];
    return result;
}

-(std::wstring) getwstring
{
    NSData* asData = [self dataUsingEncoding:kEncoding_wchar_t];
    return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
-(std::string) getstring
{
    return [self UTF8String];
}

@end

Avec cela en place (et de manière appropriée #import ed) vous pouvez maintenant :

NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];

Et la même chose pour std::wstring ce qui est plus que pratique.

26voto

John Bowers Points 622
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];

4voto

BadPirate Points 11614

J'ai aussi constaté que :

NSString *nsString = [NSString stringWithFormat:@"%s",standardString];

Il fonctionne comme un champion.

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