J'essaie d'analyser le flux d'un service Web JSON sur mon iPhone, mais la conversion utf8 ne fonctionne pas comme il se doit ou je fais quelque chose de mal Voici en dehors du flux est un r\u00c3\u00aave en noir
Voici le code que j'ai écrit pour convertir ce qui précède:
NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"Converted UTF %@",str);
Voici le résultat que je reçois:
Converted UTF est un r ê ve en noir
Le résultat attendu devrait être
Converted UTF est un rêve en noir
Lorsque j'ai vérifié la table UTF et utilisé un convertisseur UTF en ligne, la sortie est correctement obtenue avec le même code et avec la chaîne @"est un r\u00EAve en noir"
, mais je pense que la représentation UTF16 si je ne me trompe pas. Maintenant, je suis vraiment dans un correctif comment analyser ce flux.
Après beaucoup de chagrin, j'ai compris cela. Utilisez ceci.
NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
Je pense que le cas de test est cassé; le suivant:
NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSLog(@"%@", str1);
Également sorties 'est un rêve en noir'. Cependant, ceci:
NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);
Outputs 'est un rêve en noir', ainsi que:
NSString* str1 = @"est un rêve en noir";
NSString* str = [NSString stringWithUTF8String:[str1 cStringUsingEncoding:NSUTF8StringEncoding]];
NSLog(@"%@", str);
Et idem pour la version légèrement plus courte:
NSString* str1 = @"est un rêve en noir";
NSString* str = [NSString stringWithUTF8String:[str1 UTF8Encoding]];
NSLog(@"%@", str);
Et en effet:
char *str1 = "est un r\xc3\xaave en noir";
NSString* str = [NSString stringWithUTF8String:str1];
NSLog(@"%@", str);
Je pense que c'est une question de JSON, pas UTF8. Le code\u suivi de quatre chiffres hexadécimaux est le moyen utilisé par JSON pour coder un caractère générique UTF16. Donc NSString ne sait pas comment le gérer. Votre analyseur JSON doit être adapté pour analyser correctement les séquences d'échappement.
Dans iOS 9, vous n'avez rien à faire. Il est converti automatiquement.
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
}
En envoyant au serveur
NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSData *str1Data = [str1 dataUsingEncoding:NSNonLossyASCIIStringEncoding];
NSString *str2 = [[NSString alloc] initWithData:str1Data encoding:NSUTF8StringEncoding];
Après réception, vous pouvez décoder comme ceci
NSData *recivedStrData = [recivedStr dataUsingEncoding:NSUTF8StringEncoding];
NSString *strResult = [[NSString alloc] initWithData:recivedStrData encoding:NSNonLossyASCIIStringEncoding];
Cela fonctionne pour moi!