JSON中的UTF8数据无法正确保存为NSString

时间:2012-03-09 20:15:18

标签: iphone json utf-8 nsstring

我试图从iOS获取一些包含utf-8字符的数据,最终失败了:(

  1. JSON数据来自Rails应用程序。

    render :json => @users

    摘要如下所示:   {"likes_num":554,"name":"\u62c9\u7f8e\u4eb2\u5386\u8bb0\u00a0","remote_id":63573783,"remote_identifier":"douban"}

  2. 同时使用NSJSONSerializationSBJson失败。似乎utf-8字符串被修改为name = "\U62c9\U7f8e\U4eb2\U5386\U8bb0\U00a0";(使用NSLog(@"%@", json))。

  3. NSLog(@"%@", [json objectForKey:@"name"])只返回任何内容,不留任何记录。
  4. 将名称保存为NSString *nameNSLog保持不变,但调试时name的打印说明,utf-8句子显示完美。
  5. 尝试[name description],也没有得到任何结果。
  6. 请给我一些提示,弄清楚我的utf-8判决究竟发生了什么。 谢谢你提前。

    更新:其他键的值工作正常,即[json objectForKey:@"remote_identifier"]给出douban,只有@"name"无理由。

    戴夫

3 个答案:

答案 0 :(得分:1)

我认为您通过一些Web请求(Web脚本)获取此数据(您已经提到过,您从rails APP获取此数据。)

在我看来你应该看看这个。

//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

答案 1 :(得分:1)

在我的一位同事的帮助下,我终于克服了这一点。方法如下:

实际上,我在问题中没有提到name的价值有时可能是nullnil。使用此类型的值,此字段的类型设置为与KFNull相关的内容,并且每次访问数据都会将isEqualToString:发送到NSNull,而NSNull不响应该方法。

我仍然不明白为什么NSLog无法打印出非空数据。但我已经解决了这个问题。

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

令人惊讶的是它与编码无关:/

答案 2 :(得分:0)

您是从数据库中获取此信息吗?如果是这样,可能只是您的数据库没有将其输出为UTF8。我有这个问题很长一段时间。

我个人更喜欢TouchJSON而不是你试过的两个。

您可以尝试使用RestKit,它完全支持获取JSON并解析它。它似乎更适合你正在尝试的东西。

如果你的回答是JSON,你只需在RestKit的响应对象上使用“parsedBody:”方法,它就会变成一个NSDictionary。

https://github.com/RestKit/RestKit

希望有所帮助:)