wake-up-neo.com

Wie konvertiere ich std :: string nach NSString?

Hallo, ich versuche, einen Standard std::string In einen NSString umzuwandeln, aber ich habe nicht viel Glück.

Ich kann erfolgreich von einem NSString zu einem std::string Mit dem folgenden Code konvertieren

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

Ich erhalte jedoch einen Kompilierungsfehler, wenn ich Folgendes versuche

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

Der Fehler, den ich erhalte, ist

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

Vermisse ich hier etwas?

Danke im Voraus.

89

Holen Sie sich c-string aus std :: string für die Konvertierung:

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

Erstens müssen Sie Objective-C++ verwenden, damit dies im geringsten funktioniert. Am einfachsten stellen Sie sicher, dass alle Ihre *.m - Dateien in *.mm umbenannt werden.

Die bei weitem am besten verwendbare (nicht veraltete) manuelle Methode, um ein C++ std::string In ein NSString zu bekommen, ist mit:

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

Dies funktioniert in den meisten Fällen - und wenn Sie keine spezifische Kodierungserkennung und -konvertierung durchführen, liefert UTF-8 ein gutes Ergebnis, wenn nicht-lateinische Zeichen einfach funktionieren.

Wenn Sie eine größere App erstellen oder nicht die einzige sind, die daran arbeitet, möchten Sie wahrscheinlich etwas, das einfacher anzuwenden ist.

Angepasst aus Kakao-Entwickler-Mailinglisten-Archive

@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

Mit dieser Funktion (und entsprechend #import) Können Sie jetzt:

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

Und das Gleiche gilt für std::wstring, Was mehr als praktisch ist.

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

Apple hat jetzt eine neue Möglichkeit, diese Konvertierung durchzuführen. In XCode7 habe ich die Option Bearbeiten> Konvertieren> In moderne Objective C-Syntax ... verwendet, um dies herauszufinden. Es wird ein @ -Symbol verwendet.

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

Ich habe auch festgestellt, dass:

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

Funktioniert wie ein Champion.

3
BadPirate

Hier ist das Code-Snippet/Beispiel:

string str_simple = "HELLO WORLD";

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