从CFURLRef或CFStringRef转换为std :: string

时间:2015-03-04 16:43:37

标签: c++ macos stdstring cfstring cfurl-encoding

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

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

CFStringRef CFURLGetString ( CFURLRef anURL );

但现在我遇到了同样的问题。如何将CFStringRef转换为std::string

4 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:5)

CFStringRef is toll free bridged到NSString对象,所以如果您以任何方式使用Cocoa或Objective C,转换非常简单:

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

更多细节can be found here

现在,既然你没有用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);

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

答案 2 :(得分: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 CFStringGetCStringPtr可以。

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

您可以在https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc

查看Apple关于CFStringGetCString的文档

答案 3 :(得分: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;
}

还没有测试。