Данные UTF8 в JSON не могут быть сохранены как NSString должным образом - PullRequest
1 голос
/ 10 марта 2012

Я пытался получить некоторые данные, которые содержат символы utf-8 от iOS, в итоге не получилось: (

  1. Данные JSON поступают из приложения Rails.

    render :json => @users

    фрагменты ниже: {"likes_num":554,"name":"\u62c9\u7f8e\u4eb2\u5386\u8bb0\u00a0","remote_id":63573783,"remote_identifier":"douban"}

  2. Используется как NSJSONSerialization, так и SBJson со сбоями. И кажется, что строка utf-8 модифицируется как name = "\U62c9\U7f8e\U4eb2\U5386\U8bb0\U00a0"; (с использованием NSLog(@"%@", json)).

  3. NSLog(@"%@", [json objectForKey:@"name"]) просто ничего не возвращать, не оставлять лог.
  4. Сохраните имя как NSString *name, и NSLog останется прежним, но выведите описание name при отладке, предложение utf-8 выглядит идеально.
  5. Пробовал [name description], тоже ничего не получил.

Пожалуйста, дайте мне несколько советов, чтобы выяснить, что на самом деле происходит с моим предложением utf-8. Спасибо заранее.

ОБНОВЛЕНИЕ : значение для других ключей работает нормально, т. Е. [json objectForKey:@"remote_identifier"] дает douban, только @"name" вниз без причины.

Dave

Ответы [ 3 ]

1 голос
/ 12 марта 2012

С помощью моего коллеги я наконец-то справился с этим. Вот как:

На самом деле, есть кое-что, что я не упомянул в вопросе, что значение name может иногда быть null или nil. И с этим типом значения тип этого поля устанавливается на что-то связанное с KFNull, и каждый доступ к данным рискует при отправке isEqualToString: в NSNull, который не отвечает на этот метод.

И я до сих пор не понимаю, почему NSLog не удалось распечатать ненулевые данные. Но у меня есть решение проблемы.

 NSString *name = [json objectForKey:@"name"];
 if ((CFNull)name == kCFNull)
   name = nil;
 myLabel.text = name;

Удивительно, но это не имеет отношения к кодировке: /

1 голос
/ 10 марта 2012

Я думаю, что вы получаете эти данные через какой-то веб-запрос (веб-скрипт) (Вы упомянули, что вы получаете эти данные из приложения rails.)

по-моему, вы должны это проверить.

//before below line of code suppose you have done everything like ,you have creating request just encode data using `NSUTF8StringEncoding`


NSString *jsonString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];

Я бы хотел рассказать кое-что о NSUTF8StringEncoding:- Вы должны указать NSString, с помощью которого encoding можно интерпретировать байты NSData как допустимую строку. Однако он не будет изменять / преобразовывать вашу строку между кодировками. Если объект NSData содержит последовательность байтов, которая недопустима UTF-8, он просто вернет nil.

 //then follow further steps as you were .....!!!!
 //like try to parse coming response data
0 голосов
/ 10 марта 2012

Вы получаете это из базы данных?Если это так, возможно, ваша база данных не выводит его как UTF8.У меня была эта проблема долгое время.

Я лично предпочитаю TouchJSON из двух, которые вы пробовали.

Вы можете попробовать RestKit, он полностью поддерживает получение JSON и его разбор.Это кажется более приспособленным для того, что вы пытаетесь.

Если ваш ответ JSON, вы просто используете метод parsedBody: для объекта ответа из RestKit, и он превращается в NSDictionary для вас.1008 *https://github.com/RestKit/RestKit

Надеюсь, это поможет:)

...