2015-03-04 10 views
5

Wie kann ich ein CFURLRef in ein C++ std::string konvertieren?Konvertieren von CFURLRef oder CFStringRef in std :: string

Ich kann auch von den CFURLRef zu einem CFStringRef durch konvertieren:

CFStringRef CFURLGetString (CFURLRef anURL); 

Aber jetzt habe ich das gleiche Problem. Wie kann ich die CFStringRef in eine std::string konvertieren?

Antwort

5

A CFStringRef is toll free bridged zu einem NSString Objekt, also, wenn Sie mit Kakao oder Objective C in irgendeiner Weise, die Umwandlung ist super einfach:

NSString *foo = (NSString *)yourOriginalCFStringRef; 
std::string *bar = new std::string([foo UTF8String]); 

Weitere Einzelheiten can be found here.

Jetzt, da Sie diese Frage nicht mit Cocoa oder Objective-C markiert haben, vermute ich, dass Sie die Objective-C-Lösung nicht verwenden möchten.

In diesem Fall müssen Sie den C-String Äquivalent von Ihrem CFStringRef erhalten:

const CFIndex kCStringSize = 128; 
char temporaryCString[kCStringSize]; 
bzero(temporaryCString,kCStringSize); 
CFStringGetCString(yourStringRef, temporaryCString, kCStringSize, kCFStringEncodingUTF8); 
std::string *bar = new std::string(temporaryCString); 

ich einen Fehler auf dieser Code Überprüfung tun nicht und Sie können die Zeichenfolge abgerufen über CFStringGetCString auf null müssen beenden (Ich versuchte das zu mildern, indem ich tat).

6

Diese Funktion ist möglicherweise die einfachste Lösung:

const char * CFStringGetCStringPtr (CFStringRef theString, CFStringEncoding encoding); 

Natürlich gibt es eine ctr für std :: string (char *), die Sie mit diesen Einzeiler für die Umwandlung gibt:

std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8)); 
+0

Während diese Antwort ist einfach, es hat mich gebissen vor kurzem. Ich habe gerade festgestellt, dass in den Dokumenten der Kommentar neben 'CFStringGetCStringPtr' lautet:'/* Kann jederzeit NULL zurückgeben; sei auf NULL */'vorbereitet. Sei also vorsichtig, wenn du das verwendest. – dgross

1

der sicherste Weg, dies zu erreichen, wäre:

CFIndex bufferSize = CFStringGetLength(cfString) + 1; // The +1 is for having space for the string to be NUL terminated 
char buffer[bufferSize]; 

// CFStringGetCString is documented to return a false if the buffer is too small 
// (which shouldn't happen in this example) or if the conversion generally fails  
if (CFStringGetCString(cfString, buffer, bufferSize, kCFStringEncodingUTF8)) 
{ 
    std::string cppString (buffer); 
} 

Die CFStringGetCString ist nicht dokumentiert, um einen NULL wie CFStringGetCStringPtr zurückgeben können.

Stellen Sie sicher, dass Sie den richtigen CFStringEncoding-Typ verwenden. Ich denke, dass UTF8-Codierung für die meisten Dinge sicher sein sollte.

Check-out-Dokumentation von Apple können über CFStringGetCString bei https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc