web-dev-qa-db-fra.com

Décodage des caractères UTF8 en Objective C

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. 

21
Gaurav Ghate

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.

10
Tommy

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
                                                                   }
0
dip

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!

0
Sandeep Khade