UTF8 символьное декодирование в Objective C - PullRequest
21 голосов
/ 06 февраля 2011

Я пытаюсь проанализировать фид из веб-службы json на моем iPhone, однако конвертация utf8 работает не так, как должна, или я делаю что-то не так.est un r\u00c3\u00aave en noir

Вот код, который я написал для преобразования вышеупомянутого:

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

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

Это вывод, который я получаю:Converted UTF est un r ê ve en noir

Ожидаемый результат должен бытьConverted UTF est un rêve en noir

Когда я проверил таблицу UTF и использовал конвертер utf онлайн, вывод правильно получен с тем же кодом и с использованием строки @"est un r\u00EAve en noir", но я думаю, что представление UTF16, если я не ошибаюсь.Теперь я действительно в курсе, как разобрать этот канал.

Ответы [ 4 ]

39 голосов
/ 10 ноября 2011

После большого горя я понял это.Используйте это.

NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
10 голосов
/ 06 февраля 2011

Я думаю, что контрольный пример не работает; следующее:

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

Также выводит 'est un r ê en en noir'. Однако это:

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

Выводит 'est un rêve en noir', как и:

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

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

И то же самое для немного более короткой версии:

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

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

И действительно:

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

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

Я думаю, что это вопрос JSON, а не UTF8. \ U, за которым следуют четыре шестнадцатеричных цифры, - это способ JSON кодировать универсальный символ UTF16, который не является неотъемлемой частью UTF. Так что NSString не знает, как с этим бороться. Ваш анализатор JSON должен быть адаптирован для правильного анализа escape-последовательностей.

0 голосов
/ 03 апреля 2017

При отправке на сервер

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

После получения вы можете декодировать вот так

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

Это работает для меня!

0 голосов
/ 25 января 2016

В iOS 9 не нужно ничего делать.Преобразовывается автоматически.

   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
                                                                   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...