По-перше, ви повинні використовувати Objective-C ++ для цього, щоб працювати якнайменше; найпростіший спосіб забезпечити перейменування всіх ваших *.m
файлів у*.mm
На сьогоднішній день найбільш корисним (непридатним) ручним способом введення C ++ std::string
в an NSString
є:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Це працюватиме в більшості випадків - і якщо ви не робите конкретного виявлення та перетворення кодування, UTF-8 дасть вам хороший результат за те, що не латинські символи "просто працюють".
Якщо ви робите більшу програму або ви не єдиний, хто працює над цим, ви, мабуть, захочете щось легше застосувати.
Адаптовано з архівів розсилки какао-розробок
@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
З цим місцем (і відповідним чином #import
редактором) ви можете:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
І те саме std::wstring
, що більш ніж зручно.