11

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

我也可以通过以下方式从 the 转换CFURLRef为 a CFStringRef

CFStringRef CFURLGetString ( CFURLRef anURL );

但现在我有同样的问题。如何将 转换CFStringRefstd::string

4

4 回答 4

10

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

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

更多细节可以在这里找到

现在,由于您没有用 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);

我没有对此代码进行任何错误检查,您可能需要空终止通过获取的字符串CFStringGetCString(我试图通过这样做来减轻这种情况bzero)。

于 2015-03-04T18:44:00.277 回答
9

这个函数可能是最简单的解决方案:

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

当然,std::string(char*) 有一个 ctr,它为您提供了这一单行转换:

std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
于 2015-09-03T16:55:52.620 回答
2

实现这一目标的最安全方法是:

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 像CFStringGetCStringPtrcan 。

确保您使用的是正确的CFStringEncoding类型。我认为 UTF8 编码对于大多数事情来说应该是安全的。

CFStringGetCString您可以在https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc查看 Apple 的文档

于 2016-10-19T12:51:14.300 回答
0

这是我的转换功能的实现

std::string stdStringFromCF(CFStringRef s)
{
    if (auto fastCString = CFStringGetCStringPtr(s, kCFStringEncodingUTF8))
    {
        return std::string(fastCString);
    }
    auto utf16length = CFStringGetLength(s);
    auto maxUtf8len = CFStringGetMaximumSizeForEncoding(utf16length, kCFStringEncodingUTF8);
    std::string converted(maxUtf8len, '\0');

    CFStringGetCString(s, converted.data(), maxUtf8len, kCFStringEncodingUTF8);
    converted.resize(std::strlen(converted.data()));

    return converted;
}

还没有测试。

于 2018-09-21T16:23:17.440 回答