iphone - unidad - Decodificación de caracteres UTF8 en Objective C
utf-16 caracteres (4)
Estoy intentando analizar un feed de un servicio web json en mi iPhone, sin embargo, la conversión utf8 no funciona como debería o estoy haciendo algo mal. Aquí está aparte del feed.
est un r/u00c3/u00aave en noir
Aquí está 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);
Esta es la salida que estoy obteniendo:
Converted UTF est un r ê ve en noir
La salida esperada debe ser
Converted UTF est un rêve en noir
Cuando verifiqué la tabla UTF y utilicé un convertidor de utf en línea, la salida se obtuvo correctamente con el mismo código y utilizando la cadena @"est un r/u00EAve en noir"
pero creo que la representación de UTF16 no me equivoco. Ahora estoy realmente en una solución de cómo analizar este feed.
Creo que el caso de prueba está roto; el seguimiento:
NSString* str1 = @"est un r /u00c3/u00aa ve en noir";
NSLog(@"%@", str1);
También da salida ''est un r ê ve en noir''. Sin embargo, esto:
NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);
Las salidas ''est un rêve en noir'', 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 corta:
NSString* str1 = @"est un rêve en noir";
NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]];
NSLog(@"%@", str);
Y de hecho:
char *str1 = "est un r/xc3/xaave en noir";
NSString* str = [NSString stringWithUTF8String:str1];
NSLog(@"%@", str);
Creo que es una cuestión de JSON, no de 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. Así que NSString no sabe cómo lidiar con eso. El analizador JSON debe adaptarse para analizar correctamente las secuencias de escape.
Después de mucho dolor he descubierto esto. Utilizar esta.
NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
En iOS 9 no hace falta 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
}
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 puedes decodificar así.
NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding];
Esto funciona para mí!