从CFURLRef或CFStringRef转换为std :: string

3ef*_*f9g 7 c++ macos stdstring cfstring cfurl-encoding

如何将a转换CFURLRef为C++ std::string

我还可以从转换CFURLRefCFStringRef方式:

CFStringRef CFURLGetString ( CFURLRef anURL );
Run Code Online (Sandbox Code Playgroud)

但现在我有同样的问题.我怎样才能转换CFStringRefstd::string

Mic*_*ann 7

CFStringRef 免费桥接到NSString对象的,因此如果您以任何方式使用Cocoa或Objective C,转换非常简单:

NSString *foo = (NSString *)yourOriginalCFStringRef;
std::string *bar = new std::string([foo UTF8String]);
Run Code Online (Sandbox Code Playgroud)

更多细节可以在这里找到.

现在,既然你没有用Cocoa或Objective-C标记这个问题,我猜你不想使用Objective-C解决方案.

在这种情况下,您需要从CFStringRef获取等效的C字符串:

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

我没有对此代码执行任何错误检查,您可能需要null终止通过提取的字符串CFStringGetCString(我试图通过这样做来缓解bzero).


小智 7

此功能可能是最简单的解决方案:

const char * CFStringGetCStringPtr ( CFStringRef theString, CFStringEncoding encoding );
Run Code Online (Sandbox Code Playgroud)

当然,有一个用于std :: string(char*)的ctr,它为你提供了转换的单行程序:

std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
Run Code Online (Sandbox Code Playgroud)

  • 虽然这个答案很简单,但它最近让我感到震惊。我刚刚发现在文档中,`CFStringGetCStringPtr` 旁边的注释说:`/* 随时可能返回 NULL;为 NULL */` 做好准备。因此,如果您使用它,请务必小心。 (4认同)