2010-08-23 15 views
77

Hallo ich versuche, einen Standard std::string in einen NSString umzuwandeln, aber ich habe nicht viel Glück.Wie std :: string in NSString konvertieren?

kann ich konvertieren erfolgreich von einem NSString zu einem std::string mit dem folgenden Code

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

Jedoch habe ich einen Kompilierung-Fehler, wenn ich versuche, die folgende

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

Der Fehler, den ich bekommen ist

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

Fehle ich hier etwas?

Vielen Dank im Voraus.

+4

Es ist ein Tippfehler sein muss, aber du verpasst '@' für Stringliteral in 'NSString * realm = "Hollywood";' Linie. – Vladimir

+0

In meiner Bearbeitung behoben. –

Antwort

88

Get c-string aus std :: string für die Umwandlung:

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

Das scheint keine gute Antwort zu sein, wie die Dokumentation sagt: /* Benutzerabhängige Codierung, wer Wert von der Standardsprache des Benutzers und möglicherweise anderen Faktoren abgeleitet ist. Die Verwendung dieser Codierung kann manchmal erforderlich sein, wenn Benutzerdokumente mit unbekannten Codierungen interpretiert werden, wenn keine anderen Hinweise vorhanden sind. Diese Codierung sollte, wenn überhaupt, nur selten verwendet werden. Beachten Sie, dass einige potenzielle Werte hier zu unerwarteten Codierungskonvertierungen von sogar ziemlich einfachem NSString-Inhalt führen können - zum Beispiel Interpunktionszeichen mit einer bidirektionalen Codierung. */ – cyrilchampier

+23

[NSString stringWithUTF8String: mystring.c_str()] scheint passender, da die std :: string wahrscheinlicher von Ihrem eigenen Code kommt, der wahrscheinlich in UTF8 ist. – cyrilchampier

42

Erstens, haben Sie Objective-C++ zu verwenden hierfür im Geringsten zu arbeiten; einfachste Weg, um sicherzustellen, ist es, alle *.mm

Bei weitem die meisten verwendbar (nicht weiterentwickelt) manuelle Art und Weise eine C++ zu bekommen std::string in eine NSString auf Ihre *.m Dateien umbenennen 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 spezielle Codierungserkennung und -konvertierung durchführen, wird UTF-8 Ihnen ein gutes Ergebnis liefern, wenn nicht-lateinische Zeichen "einfach funktionieren".

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

von cocoa-dev mailing list archives

@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 

eingerichtet, dass mit in-Place (und entsprechend #import ed) Sie können jetzt:

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

Und das gleiche gilt für std::wstring, die mehr als praktisch.

+1

Das ist rad und ich habe es in ein paar iPhone-Projekten verwendet. Eine Sache, die mir aufgefallen ist, war, dass wenn ich das Unit-Test-Framework von Apple laufen ließ und ich eine Bibliothek mit diesen Methoden testete, musste ich die Datei mit den String-Konvertierungsmethoden als eine der "Compile Sources" in die "Build Phases" einfügen der Komponententest. Seltsam. – David

+1

Ja, der Komponententest ist im Wesentlichen sein eigenes kleines Programm und muss Zugriff auf den gleichen Code haben. Auch, Kudos für das Schreiben von Tests ;-) – rvalue

3

ich auch habe festgestellt, dass:

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

Arbeiten wie ein Weltmeister.

+3

Das ist ziemlich unsicher und funktioniert nicht garantiert. StandardString wenn ein Std :: String, ist ein C++ Objekt. C++ - Objekte sind nicht sicher für die Übergabe an variadic Funktionen (variadic Vorlagen lösen dieses Problem in C++ 11). Wenn es funktioniert, ist es ein Zufall, und fast jeder Compiler wird Sie wenigstens davor warnen, dies zu tun (wenn es kein Fehler ist, damit anzufangen). – Vitali

18
NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()]; 
6

Apple hat jetzt eine neue Möglichkeit, die Sie möchten, dass Sie diese Konvertierung durchführen. In XCode7 habe ich die Option Bearbeiten> Konvertieren> Nach Modern Objective C Syntax ... verwendet, um das herauszufinden. Es verwendet ein Kurzzeichen @.

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

Hier ist der Code-Schnipsel/Beispiel:

string str_simple = "HELLO WORLD"; 

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