【问题标题】:UTF8 data in JSON can't save as NSString properlyJSON 中的 UTF8 数据无法正确保存为 NSString
【发布时间】:2012-03-09 20:15:18
【问题描述】:

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

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

    render :json => @users

    sn-p 显示如下: {"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],也一无所获。

请给我一些提示,以弄清楚我的 utf-8 句子到底发生了什么。 提前致谢。

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

戴夫

【问题讨论】:

    标签: iphone json utf-8 nsstring


    【解决方案1】:

    我认为你是通过一些网络请求(网络脚本)获取这些数据(你已经提到,你是从 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
    

    【讨论】:

    • 您的意思是如果数据不是有效的 utf-8 字节序列,那么 jsonString 将为 nil?就我而言,可以正确地从数据中提取 jsonString。
    【解决方案2】:

    在我同事的帮助下,我终于克服了这个问题。方法如下:

    实际上,我在问题中没有提到name 的值有时可以是nullnil。并且使用这种类型的值,该字段的类型被设置为与KFNull 相关的东西,并且每次访问数据的风险都在向不响应该方法的NSNull 发送isEqualToString:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      如果您的响应是 JSON,您只需在来自 RestKit 的响应对象上使用“parsedBody:”方法,然后它就会为您变成一个 NSDictionary。

      https://github.com/RestKit/RestKit

      希望对你有帮助:)

      【讨论】:

      • 感谢您的回答,我一直在为我的项目大量使用 afnetworking,这个网络库支持多个 JSON 库,不包括
      • 你提到的两个:(但我会试试看。服务器端现在建立在 SQLite 数据库上,所有设置都保持默认。
      • 我刚刚尝试使用 'utf8-unicode-ci' 中的所有内容设置一个 mysql 数据库,不幸的是我仍然像以前一样失败。
      • 哦等等我记得...我曾经遇到过这个问题,确实是由于插入表格失败,插入表格是用另一个字符集完成的,所以utf8字符发送给它的实际存储为 utf8 表示形式。
      • 我认为我的其他项目的可用数据库的编码是utf8-general-ci,因为这个设置为utf8-unicode-ci。我已将表格编码更改为utf8-general-ci。没有按预期工作。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-15
      • 2012-10-03
      相关资源
      最近更新 更多