代码之家  ›  专栏  ›  技术社区  ›  ilmetu

编码的nsdata utf8 json,在ios中带有重音字符

  •  3
  • ilmetu  · 技术社区  · 11 年前

    我向Web服务器发出一个post请求,该服务器用JSON回答我,这是响应的头:

    Cache-Control: private
    Content-Length: 826
    Content-Type: application/json; charset=utf-8
    Date: Wed, 04 Feb 2015 05:53:59 GMT
    Server: Microsoft-IIS/8.5
    Set-Cookie: ASP.NET_SessionId=0w0mile5232yoqqdlcdomwgf; path=/; HttpOnly
    X-Aspnet-Version: 4.0.30319
    X-Powered-By: ASP.NET
    

    我解析数据响应(NSURLConnection)并序列化json:

    NSArray *arrayFromServer = [NSJSONSerialization JSONObjectWithData:dataFromServerArray options:NSJSONReadingAllowFragments error:&error];
    NSLog(@"string: %@",arrayFromServer);
    

    输出:

    string: (
        {
        altitude = 0;
        battery = 100;
        "dev_last_contact" = 1423031944;
        "device_end_licence" = 1430398189;
        "device_type" = hw;
        "email_notification" = 0;
        "end_user_type" = 0;
        "fstk_cnt" = 15;
        "fstk_ts" = 0;
        heading = 0;
        id = 62;
        imei = 0123456789APPLE;
        inversegeo = "gsm_position ";
        label = "Test\Ufffd";
        latitude = "45.503731";
        "licence_level" = 2;
        "licence_status" = valid;
        "licence_type" = 1;
        longitude = "11.90365";
        "md5_image" = CA137B2CB710BC15C87BC6A54D305A2B;
        "movement_alert" = 0;
        "on_movement" = 0;
        "pos_acy" = 1977;
        "push_notification" = 0;
        refresh = 30;
        "req_pos_cnt" = 0;
        "req_pos_ts" = 0;
        rup = "user_device_list.aspx";
        "secure_area" = 0;
        "serial_nr" = IOS;
        speed = 0;
        "text_notification" = 0;
        timestamp = 1423031944;
        "url_image" = "http://XXXXX.XXXX.XXXX.XXXX/AppImages/1422966751507_62.jpg";
    }
    )
    

    然后我像这样创建objectsArray:

    devicesArray = [[NSMutableArray alloc] init];
    for(NSDictionary *eachDevice in arrayFromServer)
    {
        //NSLog(@"DEVICE: %@",eachDevice);
    
        Device *device = [[Device alloc] initWithJSONData:eachDevice];
    
        NSString *device_id = [NSString stringWithFormat:@"%ld",(long)[device deviceId]];
        [self.all_devices_id addObject:device_id];
    
        [devicesArray addObject:device];
    }
    

    我的目标很简单:

    .h
    @interface Device : NSObject
    -(id)initWithJSONData:(NSDictionary*)data;
    ...
    
    .m
    -(id)initWithJSONData:(NSDictionary*)data{
    self = [super init];
    if(self){
        self.deviceId = [[data objectForKey:@"id"] integerValue];
    
        NSLog(@"data label : %@",[data objectForKey:@"label"]);
    
        self.label =  [data objectForKey:@"label"];
    ...
    

    输出为:

    data label : Test�
    

    如您所见,“标签”转换为“Test\Ufffd”,然后是“Test”,但应该是“Test¨” 我对重音字符有问题,如何正确编码这个字符串?

    谢谢

    2 回复  |  直到 11 年前
        1
  •  3
  •   iHulk    11 年前

    代码没有问题,因为\Ufffd是unicode,而不是¨。意味着服务器返回了错误的值。¨的正确unicode是\U00e8,您可以找到它 here 和查找 here 我希望这能解决你的问题。

        2
  •  2
  •   Anbu.Karthik    11 年前

    尝试

    [[data objectForKey:@"label"] UTF8String]; 
    

    之前

    NSString *utf = [[data objectForKey:@"label"] stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];