Hola estoy tratando de convertir un estándar std::string en un NSString pero no estoy teniendo mucha suerte.

Puedo convertir con éxito de un NSString a un std::string con el siguiente código

NSString *realm = @"Hollywood";
std::string REALM = [realm cStringUsingEncoding:[NSString defaultCStringEncoding]];

Sin embargo tengo un error de tiempo de compilación cuando me pruebe el siguiente

NSString *errorMessage = [NSString stringWithCString:REALM encoding:[NSString defaultCStringEncoding]];

El error que me sale es

Cannot convert 'std::string' to 'const char*' in argument passing

Que me estoy perdiendo algo aquí?

Gracias de antemano.

  • Debe ser un error tipográfico, pero te falta ‘@’ para la cadena literal en ‘NSString *realm = «Hollywood»;’ línea.
  • Fijo en mi edición.

6 Comentarios

  1. 100

    Obtener el c-string de std::string para la conversión:

    NSString *errorMessage = [NSString stringWithCString:REALM.c_str() 
                                       encoding:[NSString defaultCStringEncoding]];
    • Esta no parece ser una buena respuesta, ya que la documentación dice: /* el Usuario dependiente de la codificación que valor se deriva de usuario predeterminada del lenguaje y, potencialmente, de otros factores. El uso de esta codificación a veces puede ser necesaria cuando la interpretación de los documentos del usuario con desconocidos codificaciones, en ausencia de otras indicaciones. Esta codificación debe ser utilizado rara vez, si en todos. Tenga en cuenta que algunos de los posibles valores que aquí se podría dar por resultado inesperado de la codificación de las conversiones incluso bastante sencillo NSString contenido — por ejemplo, los caracteres de puntuación con una codificación bidireccional. */
    • [NSString stringWithUTF8String:mystring.c_str()] parece más adecuado, ya que el std::string, es más probable llegar desde tu propio código, que es probable que en UTF8.
    • ¿Ustedes saben por qué aquí (developer.apple.com/documentation/foundation/nsstring/…) dice que «El objeto devuelto puede ser diferente de la original receptor» ? ¿Qué significa esto y cómo sabemos si es diferente ?
    • ¿qué pasa si nuestros .mm de archivo que dice «no específicos de la codificación especificada» ?
  2. 48

    En primer lugar, tienes que estar usando Objective-C++ para este trabajo, en lo más mínimo; más fácil para asegurarse de que se cambie el nombre de todos sus *.m archivos a *.mm

    Por lejos el más útil (no en desuso) manual de modo de obtener 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 lo estás haciendo de codificación específicos de detección y conversión de UTF-8 se va a dar un buen resultado para caracteres no latinos ‘sólo el trabajo.’

    Si usted está haciendo más de la aplicación, o no eres el único trabajando en ello, sin embargo, usted probablemente querrá algo que es más fácil de aplicar.

    Adaptado de cacao-dev archivos de listas de correo

    @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 que en el lugar (y adecuadamente #imported) puede ahora:

    NSString* result = [NSString stringWithstring:param];
    string convertedBack = [result getstring];

    Y el mismo para std::wstring, que es más que útil.

    • Este es el rad y lo he usado en un par de iphone proyectos. Una cosa que noté fue que si yo estaba corriendo de Apple marco de pruebas unitarias y yo estaba probando una biblioteca que utiliza estos métodos que tenía que incluir el archivo que contiene los métodos de conversión de cadena como uno de los «Compilación de Fuentes» en la «construcción de las Fases» para la prueba de la unidad. Raro.
    • Sí, la prueba de la unidad es, esencialmente, es un pequeño programa, y necesita tener acceso a el mismo código. También, felicitaciones por escribir pruebas 😉
    • ¿Ustedes saben por qué aquí (developer.apple.com/documentation/foundation/nsstring/…) dice que «El objeto devuelto puede ser diferente de la original receptor» ? ¿Qué significa esto y cómo sabemos si es diferente ?
    • ese tipo de lenguaje en los documentos a que normalmente significa que se reservan el «derecho» bajo el contrato de interfaz para analizar, desinfectar, o normalizar la cadena de entrada. es decir, es posible que no de ida y comparar == pero en lugar de ser el «más cercano» o «mejor» representación se puede hacer. El receptor, en este caso es el NSString implementación de la clase, y el valor devuelto no es un Objetivo-C objeto, por lo que también podría ser cubierta que con algunas lenguaje estándar.
    • ¿Sabes por qué esto todavía funciona cuando usamos initWithUTF8String y la cadena no incluye caracteres utf8 , ¿cómo es que todavía es capaz de utilizar la cadena (si es de menta UTF-8) y a imprimir una vez que se llega a ser un NSString ?
    • No sé; pero es más probable que dependen de lo que los no-UTF8 bytes, y si pueden también ser válido UTF puntos de codificación. Cualquiera que sea la razón, estoy bastante seguro de que un buen código no dependen de eso; y podría detectar la codificación adecuada de primera pero en realidad eso es otra cuestión.

  3. 19
    NSString* mystring = [NSString stringWithUTF8String:stdstring.c_str()];
    • ¿esto hace que la NSString UTF8 ? o lo que la codificación sería el NSString ser ?
  4. 13

    Apple tiene ahora un nuevo camino que ellos quieren que usted para hacer esta conversión. En XCode7, he utilizado la Edición > Convertir > A la Moderna Sintaxis de Objective C… opción para averiguar esto. Utiliza una abreviatura sí[email protected]

    std::string sCPPString = "Hello World!";
    NSString *sAppleString = @(sCPPString.c_str());
  5. 3

    También he encontrado que:

    NSString *nsString = [NSString stringWithFormat:@"%s",standardString];

    Funciona como un campeón.

    • Eso es bastante seguro & no se garantiza que funcione. standardString si un std::string es un objeto de C++. Los objetos de C++ no son seguros para pasar a variadic funciones (variadic plantillas de resolver este problema en C++11). Si funciona es una casualidad & casi cada compilador, al menos, advertir en contra de hacer esto (si no es un error, para empezar).
  6. 2

    Aquí está el fragmento de código/ejemplo:

    string str_simple = "HELLO WORLD";
    
    //string to NSString
    NSString *stringinObjC = [NSString stringWithCString:str_simple.c_str()
                                    encoding:[NSString defaultCStringEncoding]];            
    NSLog(stringinObjC);

Dejar respuesta

Please enter your comment!
Please enter your name here