2015-03-04 1 views
5

Comment puis-je convertir un CFURLRef en C++ std::string?Conversion de CFURLRef ou CFStringRef en std :: string

Je peux aussi convertir la CFURLRef à un CFStringRef par:

CFStringRef CFURLGetString (CFURLRef anURL); 

Mais maintenant j'ai le même problème. Comment puis-je convertir le CFStringRef à un std::string?

Répondre

5

A CFStringRef is toll free bridged à un objet NSString, donc si vous utilisez Cocoa ou Objective C en aucune façon, la conversion est super simple:

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

Plus de détails can be found here. Maintenant, puisque vous n'avez pas étiqueté cette question avec Cocoa ou Objective-C, je suppose que vous ne voulez pas utiliser la solution Objective-C.

Dans ce cas, vous devez obtenir la chaîne C équivalent de votre CFStringRef:

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

Je n'ai pas fait la vérification des erreurs sur ce code et vous devrez peut-être mettre fin à null la chaîne récupérée via CFStringGetCString (J'ai essayé d'atténuer cela en faisant bzero).

6

Cette fonction est peut-être la solution la plus simple:

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

Bien sûr, il y a un ctr pour std :: string (char *) qui vous donne celui-liner pour la conversion:

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

Bien que cette réponse est simple, il m'a mordu récemment. Je viens de découvrir que dans les docs, le commentaire à côté de 'CFStringGetCStringPtr' dit:'/* Peut renvoyer NULL à tout moment; être préparé pour NULL */'. Alors faites attention si vous l'utilisez. – dgross

1

La meilleure façon d'y parvenir serait:

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

Le CFStringGetCString n'est pas documenté pour renvoyer une valeur nulle comme CFStringGetCStringPtr peut.

Assurez-vous que vous utilisez le type correct CFStringEncoding. Je pense que l'encodage UTF8 devrait être sûr pour la plupart des choses.

Vous pouvez consulter la documentation d'Apple à propos CFStringGetCString à https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc