【问题标题】:Unable to convert UTF-8 text from NSDictionary in Objective-C无法从 Objective-C 中的 NSDictionary 转换 UTF-8 文本
【发布时间】:2013-09-11 08:30:46
【问题描述】:

我正在使用foursquare API 获取我周围的一些位置,但是当那个地方的名称不是英文时,名称将如下所示:

name = "\U0645\U0633\U062c\U062f \U0627\U0644\U0633\U064a\U062f\U0629 \U0639\U0627\U0626\U0634\U0629 | Aisha Mosque";

我尝试将 response 转换为 UTF-8,但没有任何改变。

这是我的代码:

-(void)setUpLocations{

NSURL *url = [NSURL URLWithString: @"https://api.foursquare...."];
NSData *data = [NSData dataWithContentsOfURL:url];
NSError *error = nil;
NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:0 error:&error];
NSLog(@"Response: %@",[[[json objectForKey:@"response"]objectForKey:@"groups"]valueForKey:@"items"]);
}

而日志结果是:

      contact =                     {
                };
                id = 51712507498ec4e8c5ae9f48;
                likes =                     {
                    count = 0;
                    groups =                         (
                    );
                };
                location =                     {
                    address = Abdoun;
                    cc = JO;
                    city = Amman;
                    country = Jordan;
                    distance = 3819;
                    lat = "31.95406043797281";
                    lng = "35.88095228186612";
                };
                name = "\U0645\U0633\U062c\U062f \U0627\U0644\U0633\U064a\U062f\U0629 \U0639\U0627\U0626\U0634\U0629 | Aisha Mosque";
                restricted = 1;
                stats =                     {
                    checkinsCount = 43;
                    tipCount = 2;
                    usersCount = 23;
                };
                verified = 0;
            },

有什么建议吗??

编辑: 这是我从字典中提取数据的方法:

NSDictionary *dic = [[[[json objectForKey:@"response"]objectForKey:@"groups"]valueForKey:@"items"] copy];

namesArray = [[NSArray alloc]initWithArray:[self removeWhiteSpaces:[dic valueForKey:@"name"]]];

-(NSArray *)removeWhiteSpaces:(NSDictionary *)dic{

NSString *str = [NSString stringWithFormat:@"%@",dic];
NSString *str2 = [str stringByReplacingOccurrencesOfString:@"\n" withString:@""];
NSString *secondString = [str2 stringByReplacingOccurrencesOfString:@"  " withString:@""];
NSString *thirdString = [secondString stringByReplacingOccurrencesOfString:@"(" withString:@""];
NSString *forthString = [thirdString stringByReplacingOccurrencesOfString:@")" withString:@""];
NSString *fifthString = [forthString stringByReplacingOccurrencesOfString:@"\"" withString:@""];
NSArray *items = [fifthString componentsSeparatedByString:@","];


return items;



}

UITableView:

cell.textLabel.text = [NSString stringWithFormat:@"Name: %@ ",[namesArray objectAtIndex:indexPath.row] ];

更新

在尝试@Martin R 回答后,我得到了相同的结果:

NSDictionary *dic = [[[[json objectForKey:@"response"]objectForKey:@"groups"]valueForKey:@"items"] copy];
NSString *value =[dic valueForKey:@"name"];
NSLog(@"%@", value);
UILabel *lbl = [[UILabel alloc]initWithFrame:self.view.frame];
lbl.numberOfLines = 0;
lbl.text = [NSString stringWithFormat:@"%@",value];;
[self.view addSubview:lbl];

这是结果的图像

【问题讨论】:

    标签: objective-c utf-8 nsdictionary nsdata json


    【解决方案1】:

    没有问题。

    NSLog() 调用NSDictionaryNSArraydescription 方法,并将所有非ASCII 字符打印为\Unnnn 转义序列。

    如果您从字典中提取字符串值并打印,您将看到 一切都是正确的。

    简单示例:

    NSDictionary *dict = @{ @"currency": @"€" };
    
    NSLog(@"%@", dict);
    // Output: { currency = "\U20ac"; }
    
    NSString *value = dict[@"currency"];
    NSLog(@"%@", value);
    // Output: €
    

    更新:问题似乎出在您的 removeWhiteSpaces: 方法中,因为

    NSString *str = [NSString stringWithFormat:@"%@",dic];
    

    已经使用description方法将字典转换为字符串, 以下stringByReplacingOccurrencesOfString 电话是(对不起!)非常糟糕 解决方法。

    您应该改为使用objectForKey 访问字典键,或者枚举 带有for (NSString *key in dic) { ... } 的字典并构建所需的 数组。


    更新 2:从 JSON 数据(发布在聊天讨论中)看来,您只需要

    NSArray *itemsArray = json[@"response"][@"groups"][0][@"items]; 
    NSArray *namesArray = [itemsArray valueForKey:@"name"];
    

    注意“组”是一个数组,只有一个元素。

    【讨论】:

    • 不只是打印它,我也把它放在一个 UITableView 单元格中,结果相同,请指教。
    • @Mutawe:那你没有正确提取字符串值。也许您使用带有字典参数的stringWithFormat 来设置单元格的文本?
    • 结果 \U0645\U0633.... 也是在调用 removeWhiteSpaces: 方法之前出现的,我试过你的答案,查看更新。
    • @Mutawe:在调试器中检查dicvalue的类。 dic 真的是字典还是数组?难道value 实际上是一个数组? - 注意valueForKey应用于数组返回数组!
    • 如果我尝试使用 objectForKey 而不是 calueForKey 我得到一个错误:-[__NSArrayI objectForKey:]: unrecognized selector sent to instance 0x9939250
    【解决方案2】:

    尝试使用这个..

    [NSString stringWithUTF8String:]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-11
      • 2016-12-17
      • 1970-01-01
      • 2014-02-02
      • 1970-01-01
      • 1970-01-01
      • 2012-08-05
      相关资源
      最近更新 更多