2015-03-04 9 views

ответ

5

CFStringRef is toll free bridged на объект NSString, так что если вы используете какао или Objective C в любом случае, преобразование супер просто:

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

Подробнее can be found here.

Теперь, поскольку вы не отметили этот вопрос с помощью Cocoa или Objective-C, я предполагаю, что вы не хотите использовать решение Objective-C.

В этом случае вам нужно получить строку C эквивалент от вашего CFStringRef:

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

я не делал проверки какие-либо ошибки в этом коде, и вы, возможно, придется обнулить завершить строку сгружен через CFStringGetCString (Я попытался уменьшить это, выполнив bzero).

6

Эта функция, возможно, самое простое решение:

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

Конечно, есть СУУ для станд :: строка (символ *), который дает этот один вкладыш для преобразования:

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

Хотя этот ответ прост, он укусил меня в последнее время. Я только что обнаружил, что в документах комментарий рядом с 'CFStringGetCStringPtr' говорит:'/* Может возвращать NULL в любое время; быть подготовлен для NULL */'. Поэтому будьте осторожны, если вы используете это. – dgross

1

Самый безопасный способ достижения этой цели будет:

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

CFStringGetCString не задокументировано, чтобы вернуть NULL, например CFStringGetCStringPtr.

Убедитесь, что вы используете правильный тип CFStringEncoding. Я думаю, что кодирование UTF8 должно быть безопасным для большинства вещей.

Вы можете проверить документацию от Apple о CFStringGetCString на https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc

 Смежные вопросы

  • Нет связанных вопросов^_^