Tengo una NSString objeto y queremos convertirlo en un std::string.

¿Cómo puedo hacer esto en Objective-C++?

InformationsquelleAutor gabor | 2011-11-03

3 Comentarios

  1. 126
    NSString *foo = @"Foo";
    std::string bar = std::string([foo UTF8String]);

    Edit: Después de un par de años, permítanme ampliar esta respuesta. Como justamente se señaló, es muy probable que desee utilizar cStringUsingEncoding: con NSASCIIStringEncoding si usted va a terminar usando std::string. Usted puede utilizar UTF-8 con el normal std::strings, pero hay que tener en cuenta que aquellos que operan en bytes y no en los personajes o incluso grafemas. Para una buena «introducción», echa un vistazo a este pregunta y su respuesta.

    También tenga en cuenta, si usted tiene una cadena que no puede ser representado como ASCII, pero usted todavía desea en un std::string y no quieres que los caracteres no-ASCII en allí, usted puede utilizar dataUsingEncoding:allowLossyConversion: para obtener una NSData representación de la cadena con la pérdida codificados en ASCII de contenido y, a continuación, tirar que en su std::string

    • Cuidado de la codificación. Mientras que la codificación UTF-8 en general es una buena opción, si la API está trabajando con la espera, dicen, ASCII puro o el sistema de la página de códigos, usted tendrá que usar -cStringUsingEncoding: lugar. 🙂
    • Esto es una pérdida de memoria si no la eliminas, el puntero devuelto no es un Objetivo-C contador de referencias de objeto. En general, usted debe evitar el uso del operador new para std::string.
    • Esto no debería ser aceptada respuesta y, definitivamente, no es la primera cosa a considerar cuando se hace la conversión.
    • Después de 4 años y un par de semanas me fui a su alrededor para ampliar mi respuesta. Espero que sea más aceptable ahora.
    • Yo debería haber precisando mi opinión, pero el otro problema es el uso de un puntero por defecto. Como cuestión de hecho, un compañero de trabajo con un ObjC de fondo, con no C++ conocimiento que, sin eliminar, que termina en una pérdida de memoria. Y, más en general, los news son mal vistas, y un std::shared_ptr o std::unique_ptr debe ser preferido.
    • Guau, gracias por señalarlo. La respuesta original utiliza un puntero, hace un año que se cambió a un puntero no contestar, pero al parecer era revierte. Voy a editar el puntero de nuevo, lo siento. En el lado positivo, por fin tengo la prueba de que estoy proporcionar a las personas con un mal consejo en LO que ellos ciegamente copiar y pegar, me siento honrado :p
    • Eso es exactamente una de las razones por las que yo quería señalar como algunas personas solo ven y ciegamente copiar y pegar, eso es una gran incitación a hacer de las respuestas como correctas como sea posible… 😛

  2. 50

    Como Ynau sugerido en el comentario, en un caso general, sería mejor mantener todo en la pila en lugar de la pila (utilizando new crea la cadena en el montón), por lo tanto (suponiendo que la codificación UTF8):

    NSString *foo = @"Foo";
    std::string bar([foo UTF8String]);
  3. 6

    Como se señaló en philjordan.la ue también podría ser que el NSString es nil. En tal caso, el molde debe ser hecho como este:

    //NOTA: si foo es nula, esto va a producir un vacío de C++ cadena

    //en lugar de eliminar el puntero NULO de UTF8String.

    Esto llevaría usted a una conversión de este tipo:

    NSString *foo = @"Foo";
    std::string bar = std::string([foo UTF8String], [foo lengthOfBytesUsingEncoding:NSUTF8StringEncoding]);
    • Esto es tremendamente útil. Preocupante observar que casi todo el mundo está mirando a ella. Y’all gona accidente en la nada.

Dejar respuesta

Please enter your comment!
Please enter your name here