2012-03-03 19 views

回答

2

NSString免费桥接CFString(也就是说,您只需投下指针 - 它指向的内容可以被解释为两种类型之一),并且您可以使用vanilla C调用操作CFString

所以你通常试图CFStringGetCStringPtr尝试直接获得一个指向NSString内容为C字符串没有任何复制,然后回落的分配,如果直接指针ISN合适尺寸的C数组和CFStringGetCString” t可用(通常是因为您想要的编码与NSString的内部编码不匹配)。

CFStringGetMaximumSizeForEncoding将返回给定的编码和字符串长度所需的缓冲区的最大大小,CFStringGetLength给定字符串的长度。

因此,例如,

void Class::DoSomethingWithObjCString(NSString *objcString) 
{ 
    CFStringRef string = (CFStringRef)objcString; 

    const char *bytes = CFStringGetCStringPtr(string, kCFStringEncodingUTF8); 

    if(bytes) 
     DoSomethingWithUTF8String(bytes); 
    else 
    { 
     size_t sizeToAllocate = 
       CFStringGetMaximumSizeForEncoding(
        CFStringGetLength(string), kCFStringEncodingUTF8); 

     char *allocatedBytes = new char[sizeToAllocate]; 

     CFStringGetCString(string, 
          allocatedBytes, 
          sizeToAllocate, 
          kCFStringEncodingUTF8); 
     DoSomethingWithUTF8String(allocatedBytes); 

     delete[] allocatedBytes; 
    } 
} 
+0

我需要包含什么头才能访问这些函数? – chacham15 2012-03-03 07:59:32

+1

看起来像CoreFoundation/CoreFoundation.h – Tommy 2012-03-03 17:59:39

2

这不是愚蠢的使用Objective-C。

也就是说,您可以将NSString *转换为CFStringRef并使用CFString函数获取C字符串。您可能会发现CFStringGetLengthCFStringGetCString函数和kCFStringEncodingUTF8常数有用。请记住,许多Unicode字符需要多个字节来表示UTF-8。

相关问题