Thứ nhất, bạn đã có được sử dụng Objective-C++ để làm việc này một chút nào; Cách dễ nhất để đảm bảo đó là đổi tên tất cả *.m
tập tin của bạn để *.mm
Bởi đến nay có thể sử dụng hầu hết các cách thủ công (không bị phản đối) nhận được một C++ std::string
thành một NSString
là với:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
này sẽ làm việc 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ã cụ thể, UTF-8 sẽ cung cấp cho bạn kết quả tốt cho việc có các ký tự không phải là chữ latin ”.
Nếu bạn đang tạo 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 đó, tuy nhiên - có thể bạn sẽ muốn có thứ dễ áp dụng hơn.
Phỏng theo cocoa-dev mailing list archives
@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 rằng tại chỗ (và thích hợp #import
ed), bạn có thể:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Và tương tự cho std::wstring
, mà là nhiều hơn tiện dụng.
Nó phải là một lỗi đánh máy, nhưng bạn đang bỏ lỡ '@' cho chuỗi chữ trong 'NSString * vương = "Hollywood";' hàng. – Vladimir
Đã sửa trong chỉnh sửa của tôi. –