Đầu tiên, bạn phải sử dụng Objective-C ++ để điều này hoạt động một cách nhỏ nhất; cách dễ nhất để đảm bảo rằng đổi tên tất cả các *.m
tệp của bạn thành*.mm
Cho đến nay, cách thủ công hữu dụng nhất (không bị phản đối) để chuyển C ++ std::string
vào an NSString
là với:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Điều này sẽ hoạt động trong hầu hết các trường hợp - và nếu bạn không thực hiện phát hiện và chuyển đổi mã hóa cụ thể, UTF-8 sẽ cung cấp cho bạn một kết quả tốt để có các ký tự không phải latin 'chỉ hoạt động'.
Tuy nhiên, nếu bạn đang tạo ra một ứng dụng lớn hơn hoặc bạn không phải là người duy nhất làm việc trên ứng dụng đó - có thể bạn sẽ muốn thứ gì đó dễ áp dụng hơn.
Phỏng theo kho lưu trữ danh sách gửi thư của nhà phát triển ca cao
@interface NSString (cppstring_additions)
+(NSString*) stringWithwstring:(const std::wstring&)string;
+(NSString*) stringWithstring:(const std::string&)string;
-(std::wstring) getwstring;
-(std::string) getstring;
@end
@implementation NSString (cppstring_additions)
#if TARGET_RT_BIG_ENDIAN
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32BE);
#else
const NSStringEncoding kEncoding_wchar_t = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
#endif
+(NSString*) stringWithwstring:(const std::wstring&)ws
{
char* data = (char*)ws.data();
unsigned size = ws.size() * sizeof(wchar_t);
NSString* result = [[NSString alloc] initWithBytes:data length:size encoding:kEncoding_wchar_t];
return result;
}
+(NSString*) stringWithstring:(const std::string&)s
{
NSString* result = [[NSString alloc] initWithUTF8String:s.c_str()];
return result;
}
-(std::wstring) getwstring
{
NSData* asData = [self dataUsingEncoding:kEncoding_wchar_t];
return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
-(std::string) getstring
{
return [self UTF8String];
}
@end
Với điều đó tại chỗ (và được chỉnh sửa phù hợp #import
) bây giờ bạn có thể:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Và điều tương tự đối với std::wstring
, điều này còn hơn cả tiện dụng.