我试图从iOS获取一些包含utf-8字符的数据,最终失败了:(
JSON数据来自Rails应用程序。
render :json => @users
摘要如下所示:
{"likes_num":554,"name":"\u62c9\u7f8e\u4eb2\u5386\u8bb0\u00a0","remote_id":63573783,"remote_identifier":"douban"}
同时使用NSJSONSerialization
和SBJson
失败。似乎utf-8字符串被修改为name = "\U62c9\U7f8e\U4eb2\U5386\U8bb0\U00a0";
(使用NSLog(@"%@", json)
)。
NSLog(@"%@", [json objectForKey:@"name"])
只返回任何内容,不留任何记录。NSString *name
,NSLog
保持不变,但调试时name
的打印说明,utf-8句子显示完美。 [name description]
,也没有得到任何结果。请给我一些提示,弄清楚我的utf-8判决究竟发生了什么。 谢谢你提前。
更新:其他键的值工作正常,即[json objectForKey:@"remote_identifier"]
给出douban
,只有@"name"
无理由。
戴夫
答案 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
的价值有时可能是null
或nil
。使用此类型的值,此字段的类型设置为与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
希望有所帮助:)