En primer lugar, tienes que estar usando Objective-C++ para que esto funcione en lo más mínimo; forma más fácil de asegurarse de que se cambie el nombre de todos sus *.m
archivos a *.mm
Con mucho, el más fácil de usar de forma manual (no se use) de conseguir un C++ std::string
en un NSString
es con:
std::string param; // <-- input
NSString* result = [NSString stringWithUTF8String:param.c_str()];
NSString* alternative = [[NSString alloc] initWithUTF8String:param.c_str()];
Esto funcionará en la mayoría de los casos, y si no está haciendo una detección y conversión de codificación específica, UTF-8 le dará un buen resultado al hacer que los caracteres no latinos funcionen.
Si está haciendo una aplicación más grande, o no es la única que trabaja en ella, sin embargo, probablemente querrá algo más fácil de aplicar.
Adaptado de 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
Con esto en contexto (y apropiadamente #import
ed) que ahora puede:
NSString* result = [NSString stringWithstring:param];
string convertedBack = [result getstring];
Y lo mismo para std::wstring
, que es más práctico.
Tiene que ser un error tipográfico, pero que se está perdiendo '@' para la cadena literal en 'NSString * realm = "Hollywood";' línea. – Vladimir
Solucionado en mi edición. –