2011-02-06 36 views
19

Estoy tratando de analizar un canal de un servicio web JSON en mi iPhone sin embargo, la conversión de UTF-8 no está funcionando como debiera, o estoy haciendo algo mal Aquí es aparte de la alimentación
est un r\u00c3\u00aave en noirde caracteres UTF8 decodificación en C Objetivo

Este es el código que he escrito para convertir lo anterior:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]]; 
NSLog(@"Converted UTF %@",str); 

Ésta es la salida que me estoy haciendo:
Converted UTF est un r ê ve en noir

El resultado esperado debería ser
Converted UTF est un rêve en noir

Al revisar la tabla UTF y se utiliza un convertidor utf en línea la salida se puso correctamente con el mismo código y utilizando la cadena @"est un r\u00EAve en noir" pero creo que la Representación UTF16 si no estoy equivocado. Ahora estoy realmente en una solución sobre cómo analizar este feed.

+0

solución perfecta http://stackoverflow.com/questions/6204718/status-code-0-on-google-geocode-api-from-iphone-sim-but-works-fine-on-web -non/6204970 # 6204970 felicitaciones ... – Moacir

Respuesta

11

Creo que el caso de prueba está roto; lo siguiente:

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 
NSLog(@"%@", str1); 

También se emite 'est un r ª ve en noir'. Sin embargo, esto: 'est un rêve en noir'

NSString* str1 = @"est un rêve en noir"; 
NSLog(@"%@", str1); 

salidas, como lo hace:

NSString* str1 = @"est un rêve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]]; 
NSLog(@"%@", str); 

Y lo mismo para la versión ligeramente más corto:

NSString* str1 = @"est un rêve en noir"; 

NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]]; 
NSLog(@"%@", str); 

Y, en efecto:

char *str1 = "est un r\xc3\xaave en noir"; 

NSString* str = [NSString stringWithUTF8String:str1]; 
NSLog(@"%@", str); 

Creo que es una questi en JSON, no en UTF8. El \ u seguido de cuatro dígitos hexadecimales es la forma en que JSON codifica un carácter genérico UTF16, no es una parte inherente de UTF. Entonces NSString no sabe cómo manejarlo. Su analizador JSON necesita ser adaptado para analizar correctamente las secuencias de escape.

+0

de acuerdo, si la salida json fuera real utf-8, sería como, – heisian

38

Después de mucho dolor he descubierto esto. Utilizar esta.

NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding]; 
+1

Muchas gracias, exactamente lo que estaba buscando. – Luc

+0

No hay problema. Solo una advertencia, he tenido problemas de pérdida de memoria con esta solución. Creo que * solucioné con [NSString stringWithString: (el código anterior)] –

+1

Eres un salvavidas. Después de buscar durante tantas horas, estaba a punto de darme por vencida. Y luego, encontré este dulce trozo de código. Muchas gracias. Esta debería ser la respuesta aceptada. –

0

En iOS 9 no es necesario hacer nada. Se convierte automáticamente

NSURLSessionUploadTask *uploadTask = [session uploadTaskWithRequest:request 
                   fromData:postData completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

                    NSLog(@"response header: %@",response); 

                    NSString* aStr; 
                   aStr = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
                   NSLog(@"response data: %@", aStr); 

                   NSDictionary * json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

                   for (NSDictionary *dict in json) 
                   { 
                    NSLog(@"%@", dict); 
                    NSString *name = [dict objectForKey:@"name"]; 
                    NSString *msg = [dict objectForKey:@"message"]; 
                    NSString *topic = [dict objectForKey:@"topic"]; 
                    NSLog(@"*********** %@, %@, %@", name,topic,msg); 

                    // now do something 
                    } 
0

Mientras se envía al servidor

NSString* str1 = @"est un r \u00c3\u00aa ve en noir"; 
    NSData *str1Data = [str1 dataUsingEncoding:NSNonLossyASCIIStringEncoding]; 
    NSString *str2 = [[NSString alloc] initWithData:str1Data encoding:NSUTF8StringEncoding]; 

Después de recibir puede decodificar como esto

NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding]; 
    NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding]; 

Esto funciona para mí!

Cuestiones relacionadas