Erstens müssen Sie Objective-C ++ verwenden, damit dies im geringsten funktioniert. Der einfachste Weg, um sicherzustellen, dass alle Ihre *.m
Dateien in umbenannt werden*.mm
Die bei weitem am besten verwendbare (nicht veraltete) manuelle Methode, um ein C ++ std::string
in ein C ++ zu bringen, NSString
ist:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Dies funktioniert in den meisten Fällen - und wenn Sie keine spezifische Codierungserkennung und -konvertierung durchführen, liefert UTF-8 ein gutes Ergebnis, wenn nicht-lateinische Zeichen "nur funktionieren".
Wenn Sie jedoch eine größere App erstellen oder nicht die einzige sind, die daran arbeitet, möchten Sie wahrscheinlich etwas, das einfacher anzuwenden ist.
Angepasst aus den Archiven der Cocoa-Dev-Mailinglisten
@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
Mit diesem In-Place (und entsprechend #import
bearbeitet) können Sie jetzt:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Und das gleiche für std::wstring
, was mehr als praktisch ist.