搜索

首页  >  问答  >  正文

objective-c - iOS json数据打印解析

黄舟黄舟2773 天前828

全部回复(4)我来回复

  • 怪我咯

    怪我咯2017-04-17 16:55:08

    1. 这确实不是二进制,是 unicode 编码,可以在使用 lldb 中使用 p 命令或在 shell 中使用 echo 命令打印这些编码,均可打印出可读的中文。

    2. 从 iOS 5 开始(没有验证,但早期打印数组和字典均和现在打印对象的显示一致,<名称:内存地址>),打印数组和字典显示出具体的数据结构(description 方法),更方便了调试,但其中打印字符串时并未做任何处理(如此处的字符转义)。由于只是便于调试,而且打印具体字符串时,调用字符串的 desciption 方法时,会转义为可读中文,也就是到具体处理的时候会自动转义,不用也不应该自己去转。

    3. 非得在控制台显示中文的话可以这样,NSLog(@"%@",[NSString stringWithCString:[[dictionary description] cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding]);;也可以重写 description 方法。但个人感觉其实没有这个必要。

    4. 补充:最近在使用 p 命令时,发现 p "U4e3dU5c71" 这种形式打印会报错 error: incomplete universal character name ,发现 u 的大小写是不一样,应该的形式是 p "u4e3du5c71" (四位)或者 p "U00004e3dU00005c71"(八位)。虽然没找到明确文字说明,但可以推论出,小写的是 BMK[NSString 与 Unicode],默认0号平面,缺省前四位0。

    回复
    0
  • 怪我咯

    怪我咯2017-04-17 16:55:08

    json转换为字典,根据key值取得数据

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 16:55:08

    iOS 开发小白怒答一枚.
    先纠正一下, "u8bc4u8bbau6807u9898"是 Unicode 编码, 并非是题主说的"二进制".
    所以只要把 Unicode 解码转成中文就可以啦~ 大概有两个方法可以解决这个问题~

    1. 用在线转换工具. 百度一搜一堆就不具体举例子了;

    2. 写一个转换用的工具类, 下面贴上代码;

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSString *unicodeString = @"\u8bc4\u8bba\u6807\u9898";
        NSLog(@"%@", [self replaceUnicode:unicodeString]);
    }
    
    // 将 Unicode 编码转换成中文
    - (NSString *)replaceUnicode:(NSString *)unicodeStr {
        NSString *tempStr1 = [unicodeStr stringByReplacingOccurrencesOfString:@"\u" withString:@"\U"];
        NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@"\"" withString:@"\\""];
        NSString *tempStr3 = [[@"\"" stringByAppendingString:tempStr2] stringByAppendingString:@"\""];
        NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];
        
        NSString* returnStr = [NSPropertyListSerialization propertyListFromData:tempData
                                                               mutabilityOption:NSPropertyListImmutable
                                                                         format:NULL
                                                               errorDescription:NULL];
    
        return [returnStr stringByReplacingOccurrencesOfString:@"\r\n" withString:@"\n"]; 
    }

    回复
    0
  • ringa_lee

    ringa_lee2017-04-17 16:55:08

    在lldb里面直接po出来

    回复
    0
  • 取消回复