¿Cómo representar el valor NSString con el valor ' 336 362 340' en la codificación apropiada como texto normal?

StackOverflow https://stackoverflow.com/questions/9369603

Pregunta

Tengo cadenas como esta de Audio Stream como títulos:

Þòà - Ïàäàòü

Sé que esta cadena en ruso. Y necesito mostrarlo correctamente en Uilabel. Intento esto:

NSData *data = [value dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *goodValue = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Ahora goodValue Contiene el siguiente valor:

\336\362\340 - \317\340\344\340\362\374

Número de caracteres como veo el guardado con el original. Pero, ¿cómo debería convertirlo en una cadena normal para usar como texto en Uilabel?

Gracias por adelantado.

¿Fue útil?

Solución

Escribí algún código para iterando y registrando todas las combinaciones posibles.

Al principio encontré la lista de todas las codificaciones posibles en nsstring.h y establecíla en la matriz de codificaciones posibles:

 int encodings[] = {
    NSASCIIStringEncoding,
    NSNEXTSTEPStringEncoding,
    NSJapaneseEUCStringEncoding,
    NSUTF8StringEncoding,
    NSISOLatin1StringEncoding,
    NSSymbolStringEncoding,
    NSNonLossyASCIIStringEncoding,
    NSShiftJISStringEncoding,
    NSISOLatin2StringEncoding,
    NSUnicodeStringEncoding,
    NSWindowsCP1251StringEncoding,
    NSWindowsCP1252StringEncoding,
    NSWindowsCP1253StringEncoding,
    NSWindowsCP1254StringEncoding,
    NSWindowsCP1250StringEncoding,
    NSISO2022JPStringEncoding,
    NSMacOSRomanStringEncoding,
    NSUTF16StringEncoding,
    NSUTF16BigEndianStringEncoding,
    NSUTF16LittleEndianStringEncoding,
    NSUTF32StringEncoding,
    NSUTF32BigEndianStringEncoding,
    NSUTF32LittleEndianStringEncoding
};

Y ahora vamos a iterar y mostrar todos los resultados posibles:

int numberOfEncodings = 23;

for (int i = 0; i < numberOfEncodings; i++) {
    NSLog(@"=============== %d =============", encodings[i]);
    constchar *asd = [value cStringUsingEncoding:encodings[i]];
    if (asd == NULL) {
        NSLog(@"asd == NULL");
    } else {
        for (int j = 0; j < numberOfEncodings; j++) {
            NSString *str = [NSStringstringWithCString:asd encoding:encodings[j]];
            NSLog(@"%d: %@", encodings[j], str);
        }
    }
}

Después de eso, miro los resultados y encontré una buena cadena. Eso es todo =)

Nota: Todas las codificaciones son valores de NSStringEncoding enum. Y podría pensar que podría iterar de 0 al número de codificaciones en lugar de definir codificaciones [] matriz. Pero no debe hacer esto, porque los valores de codificación no son INT ascendentes. Por ejemplo, NSMACOSROMANSTRINGEDING = 30 y parte de esta codificación son alias para otro. Que mejor para definir la matriz de posibles codificaciones.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top