从 CFURLRef 或 CFStringRef 转换为 std::string
Convert from CFURLRef or CFStringRef to std::string
如何将 CFURLRef
转换为 C++ std::string
?
我还可以通过以下方式将 CFURLRef
转换为 CFStringRef
:
CFStringRef CFURLGetString ( CFURLRef anURL );
但是现在我遇到了同样的问题。如何将 CFStringRef
转换为 std::string
?
一个 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);
我没有对此代码进行任何错误检查,您可能需要空终止通过 CFStringGetCString
获取的字符串(我试图通过 bzero
来缓解这种情况)。
这个函数可能是最简单的解决方案:
const char * CFStringGetCStringPtr ( CFStringRef theString, CFStringEncoding encoding );
当然,std::string(char*) 有一个 ctr,它为您提供了转换的一行代码:
std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
实现此目的的最安全方法是:
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
没有像 CFStringGetCStringPtr
那样记录为 return NULL。
确保您使用的 CFStringEncoding
类型正确。我认为 UTF8 编码对于大多数事情应该是安全的。
您可以在 https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc
查看 Apple 关于 CFStringGetCString
的文档
下面是我实现的转换函数
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, '[=10=]');
CFStringGetCString(s, converted.data(), maxUtf8len, kCFStringEncodingUTF8);
converted.resize(std::strlen(converted.data()));
return converted;
}
还没有测试。
如何将 CFURLRef
转换为 C++ std::string
?
我还可以通过以下方式将 CFURLRef
转换为 CFStringRef
:
CFStringRef CFURLGetString ( CFURLRef anURL );
但是现在我遇到了同样的问题。如何将 CFStringRef
转换为 std::string
?
一个 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);
我没有对此代码进行任何错误检查,您可能需要空终止通过 CFStringGetCString
获取的字符串(我试图通过 bzero
来缓解这种情况)。
这个函数可能是最简单的解决方案:
const char * CFStringGetCStringPtr ( CFStringRef theString, CFStringEncoding encoding );
当然,std::string(char*) 有一个 ctr,它为您提供了转换的一行代码:
std::string str(CFStringGetCStringPtr(CFURLGetString(anUrl),kCFStringEncodingUTF8));
实现此目的的最安全方法是:
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
没有像 CFStringGetCStringPtr
那样记录为 return NULL。
确保您使用的 CFStringEncoding
类型正确。我认为 UTF8 编码对于大多数事情应该是安全的。
您可以在 https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc
查看 Apple 关于CFStringGetCString
的文档
下面是我实现的转换函数
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, '[=10=]');
CFStringGetCString(s, converted.data(), maxUtf8len, kCFStringEncodingUTF8);
converted.resize(std::strlen(converted.data()));
return converted;
}
还没有测试。