2013-02-22 2 views
0

Я хочу использовать онлайн-данные из файла JSON. В настоящее время он работает, но когда я использую специальные символы, он показывает «null». Вот код, который я использую:NSJSONSerialization: правильно обрабатывать специальные символы

NSString *urlString = [NSString stringWithFormat:@"http://belesios.com/burc/koc2.php"]; 
NSURL *url = [NSURL URLWithString:urlString]; 
NSData *data = [NSData dataWithContentsOfURL:url]; 
NSError *error; 
NSMutableDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error]; 
NSLog(@"%@", json); 
NSString *ciktiText = [[NSString alloc] initWithFormat:@"%@", json]; 
[kocLabel setText:ciktiText]; 

Например, если в моем файле содержится ç или ü, возвращается null. Что мне нужно сделать?

+0

Первое, что вам нужно сделать, это распечатать эту ошибку. - Сервер посылает данные JSON в UTF-8? –

+0

Нет, первое, что написано на английском языке, а не злоупотребление тегами. Проводка сообщения об ошибке помогает, но это только вторая вещь. –

+2

Если код символа превращает его в NSString без «повреждения», тогда любой соответствующий JSON-сериализатор/парсер должен обработать его. Однако важно, чтобы данные не были повреждены при передаче данных. Вам нужно будет дать нам более конкретный пример того, что, по вашему мнению, вы получаете, и то, что, по вашему мнению, переводится, чтобы начать отлаживать это. –

ответ

4

Попробуйте этот метод, чтобы выяснить, какая кодировка используется, когда данные извлекается из сервера:

NSStringEncoding encoding; 
NSString *jsonString =[NSString stringWithContentsOfURL:URL usedEncoding:&encoding error:&error]; 
if (error) 
    NSLog(@"Error: %@", error); 

Вы должны проверить кодирование данных, возвращаемых сервером. Ваш код правильный, но вы должны добавить некоторую проверку, если ошибка! = Nil, затем не выполняет и не отображает или не регистрирует это.

NSString *jsonString = @"{\"abc\":\"ç or ü\"}"; 
NSDictionary *jsonObj = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error]; 
NSLog(@"Output: %@", jsonObj); 

Выход: {а = "\ U00e7 или \ U00fc"; } Вот как ваш ответ сервера должен выглядеть с кодированным символом, если вы используете Fiddler или какое-либо другое программное обеспечение для печати необработанного ответа.

В настоящее время ваши данные выглядит куда как UTF8 кодированные символы должны быть как \ U00e7 = ç enter image description here

+0

Зачем это лучше? Ваш код преобразует ответ сервера в NSString, а затем обратно в NSData, нет никакой разницы в непосредственном использовании 'dataWithContentsOfURL'. –

+0

@MartinR Кодирование по умолчанию - это NSASCIIEncoding, но для того, чтобы иметь специальные символы, упомянутые в вопросе, нужно UTF8, и если я не ошибаюсь, нет прямого метода для загрузки данных в конкретную кодировку. Пожалуйста, поправьте меня, если я ошибаюсь. – SAPLogix

+3

'dataWithContentsOfURL' загружает ответ сервера без какого-либо преобразования. Ваш код преобразует ответ сервера (интерпретируемый как UTF-8) в NSString и обратно в NSData. Если сервер отправляет UTF-8, в результате нет никакой разницы. Если сервер не отправляет UTF-8, ваш код не преобразует его в UTF-8. –

Смежные вопросы