web-dev-qa-db-fra.com

Comment convertir std :: string en NSString?

Salut, je suis en train de convertir un standard std::string dans un NSString mais je n'ai pas beaucoup de chance.

Je peux convertir avec succès d'un NSString à un std::string avec le code suivant

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

Cependant, je reçois une erreur de compilation lorsque j'essaye ce qui suit.

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

L'erreur que je reçois est

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

Est-ce que j'ai râté quelque chose?

Merci d'avance.

89
Anthony McCormick

Récupère la chaîne c de std :: string pour la conversion:

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

Tout d’abord, vous devez utiliser Objective-C++ pour que cela fonctionne le moins du monde; Le moyen le plus simple de s’assurer qu’il renomme tous vos *.m fichiers à *.mm

De loin le moyen manuel le plus utilisable (non obsolète) d’obtenir un fichier C++ std::string dans 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 procédez pas à une détection et à une conversion d'encodage spécifiques, UTF-8 vous donnera un bon résultat si vous utilisez des caractères non latins.

Si vous créez une application plus grande, ou si vous n'êtes pas le seul à y travailler, vous voudrez probablement quelque chose qui soit 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 convenablement #imported) vous pouvez maintenant:

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

Et pareil pour std::wstring, ce qui est plus que pratique.

48
rvalue
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
19
John Bowers

Apple a maintenant une nouvelle façon de faire de cette conversion. Dans XCode7, j'ai utilisé l'option Edition> Convertir> Syntaxe de l'objectif moderne C ... pour le découvrir. Il utilise un symbole @ abrégé.

std::string sCPPString = "Hello World!";
NSString *sAppleString = @(sCPPString.c_str());
13
Volomike

J'ai aussi constaté que:

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

Fonctionne comme un champion.

3
BadPirate

Voici l'extrait de code/exemple:

string str_simple = "HELLO WORLD";

//string to NSString
NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                encoding:[NSString defaultCStringEncoding]];            
NSLog(stringinObjC);
2
Deepak Kumar