2015-03-04 22 views
5

Làm cách nào để chuyển đổi một số CFURLRef thành C++ std::string?Chuyển đổi từ CFURLRef hoặc CFStringRef thành std :: string

Tôi cũng có thể chuyển đổi từ các CFURLRef đến một CFStringRef bởi:

CFStringRef CFURLGetString (CFURLRef anURL); 

Nhưng bây giờ tôi có cùng một vấn đề. Làm cách nào để chuyển đổi CFStringRef thành một số std::string?

Trả lời

5

Một CFStringRef is toll free bridged đến một đối tượng NSString, vì vậy nếu bạn đang sử dụng Cocoa hoặc Objective C dưới mọi hình thức, chuyển đổi là siêu đơn giản:

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

Chi tiết can be found here.

Bây giờ, vì bạn không gắn thẻ câu hỏi này với Cocoa hoặc Objective-C, tôi đoán bạn không muốn sử dụng giải pháp Mục tiêu-C.

Trong trường hợp này, bạn cần phải nhận được chuỗi C tương đương từ CFStringRef của bạn:

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

tôi đã không làm bất kỳ kiểm tra lỗi trên mã này và bạn có thể cần để null chấm dứt chuỗi vời qua CFStringGetCString (Tôi đã cố gắng giảm thiểu điều đó bằng cách thực hiện bzero).

6

Chức năng này có thể là giải pháp đơn giản nhất:

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

Tất nhiên, có một ctr cho std :: string (char *) mang đến cho bạn một-liner cho việc chuyển đổi:

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

Trong khi câu trả lời này là đơn giản, nó cắn tôi thời gian gần đây. Tôi vừa phát hiện ra rằng trong các tài liệu, chú thích bên cạnh 'CFStringGetCStringPtr' nói:'/* Có thể trả về NULL bất cứ lúc nào; được chuẩn bị cho NULL */'. Vì vậy, hãy cẩn thận nếu bạn sử dụng điều này. – dgross

1

cách an toàn nhất để đạt được điều này sẽ là:

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); 
} 

các CFStringGetCString không phải là tài liệu để trả về một NULL như CFStringGetCStringPtr có thể.

Đảm bảo rằng bạn đang sử dụng đúng loại CFStringEncoding. Tôi nghĩ rằng mã hóa UTF8 nên được an toàn cho hầu hết mọi thứ.

Bạn có thể kiểm tra tài liệu của Apple về CFStringGetCString tại https://developer.apple.com/reference/corefoundation/1542721-cfstringgetcstring?language=objc

Các vấn đề liên quan