2015-03-04 8 views
5

Come convertire un CFURLRef in un C++ std::string?Convertire da CFURLRef o CFStringRef a std :: string

Ho inoltre possibile convertire dal CFURLRef ad un CFStringRef da:

CFStringRef CFURLGetString (CFURLRef anURL); 

Ma ora ho lo stesso problema. Come posso convertire lo CFStringRef in uno std::string?

risposta

5

Un CFStringRef is toll free bridged a un oggetto NSString, quindi se si sta utilizzando cacao o Objective C in alcun modo, la conversione è super semplice:

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

Maggiori dettagli can be found here.

Ora, dato che non hai taggato questa domanda con Cocoa o Objective-C, suppongo che tu non voglia usare la soluzione Objective-C.

In questo caso, è necessario per ottenere la stringa C equivalente dal CFStringRef:

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

non ho fatto alcun controllo degli errori su questo codice e potrebbe essere necessario a null terminare la stringa recuperata tramite CFStringGetCString (Ho cercato di mitigarlo facendo bzero).

6

Questa funzione è forse la soluzione più semplice:

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

Naturalmente, c'è un ctr per std :: string (char *) che ti dà questo uno-liner per la conversione:

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

Mentre questa risposta è semplice, mi ha morso di recente. Ho appena scoperto che nei documenti, il commento accanto a 'CFStringGetCStringPtr' dice:'/* Può restituire NULL in qualsiasi momento; essere preparato per NULL */'. Quindi stai attento se lo usi. – dgross

1

Il modo più sicuro per raggiungere questo sarebbe:

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); 
} 

Il CFStringGetCString non è documentato per restituire un NULL come CFStringGetCStringPtr can.

Assicurarsi di utilizzare il tipo corretto CFStringEncoding. Penso che la codifica UTF8 dovrebbe essere sicura per la maggior parte delle cose.

È possibile controllare la documentazione di Apple circa CFStringGetCString a https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc

Problemi correlati