Ответ 1
После многого горения я понял это. Используйте это.
NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
Я пытаюсь разобрать фид из json webservice на моем 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, если я не ошибаюсь. Теперь я действительно исправляю, как разбирать этот фид.
После многого горения я понял это. Используйте это.
NSString *correctString = [NSString stringWithCString:[utf8String cStringUsingEncoding:NSISOLatin1StringEncoding] encoding:NSUTF8StringEncoding];
Я думаю, что тестовый пример сломан; следующее:
NSString* str1 = @"est un r \u00c3\u00aa ve en noir";
NSLog(@"%@", str1);
Также выводит "est un r ê ve en noir". Однако это:
NSString* str1 = @"est un rêve en noir";
NSLog(@"%@", str1);
Выводится "un 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-последовательностей.
В 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
}
При отправке на сервер
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];
Это работает для меня!