美文网首页
iOS解NSArray,NSDictionary unicode

iOS解NSArray,NSDictionary unicode

作者: ashura_ | 来源:发表于2017-05-02 19:53 被阅读0次

    问题

    看代码

    //创建数组
    NSArray *array = @[@"abc",@"中文"];
    //创建字典
    NSDictionary *dict = @{@"key1" : @"abc",
                           @"key2" : @"中文",
                           };
    //打印数组和字典
    NSLog(@" \n dict = %@ \n array = %@",dict,array);
    

    结果

    (lldb) po array
    <__NSArrayI 0x7fc6e420d620>(
    abc,
    中文
    )
    
    
    (lldb) po dict
    {
        key1 = abc;
        key2 = "\U4e2d\U6587";
    }
    
    2016-12-20 13:58:18.492 TSUnicodeFormant[55360:1772807]  
     dict = {
        key1 = abc;
        key2 = "\U4e2d\U6587";
    } 
     array = (
        abc,
        "\U4e2d\U6587"
    )
    (lldb) 
    

    结论

    类型 NSArray NSDictionary
    NSLog unicode码 unicode码
    Po 正常 unicode码

    NSLog与po的的表现不尽一致,所以对NSDictionary要进行两方面处理。

    分析

    国际惯例,当遇到问题时候。四个步骤apple Document->google->github->百度

    查看文档

    • 已知其实无论NSLog还是po,都会调用description方法,descriptionNSObject的方法。
      所以以description搜索,找到descriptionWithLocale:(NSArray,NSDictionary都有)

    Returns a string object that represents the contents of the dictionary, formatted as a property list.

    解决方案

    重写descriptionWithLocale:,这里写在分类里

    -(NSString *)descriptionWithLocale:(id)locale
    {
        NSMutableString *msr = [NSMutableString string];
        [msr appendString:@"["];
        for (id obj in self) {
            [msr appendFormat:@"\n\t%@,",obj];
        }
        //去掉最后一个逗号(,)
        if ([msr hasSuffix:@","]) {
            NSString *str = [msr substringToIndex:msr.length - 1];
            msr = [NSMutableString stringWithString:str];
        }
        [msr appendString:@"\n]"];
        return msr;
    }
    

    进行测试,

    (lldb) po dict
    {
        key1 = abc;
        key2 = "\U4e2d\U6587";
    }
    
    2016-12-20 14:35:48.002 TSUnicodeFormant[56085:1799830]  
     dict = {
        key1 = abc,
        key2 = 中文
    } 
     array = [
        abc,
        中文
    ]
    (lldb) 
    

    可以看出,就剩下po有问题了。
    万般无奈,只能用黑魔法了。首先在项目导入 JRSwizzle 库,在合理的地方,加入

    [NSDictionary jr_swizzleMethod:@selector(description) withMethod:@selector(my_description) error:nil];
    

    在分类里对description进行置换

    - (NSString*)my_description {
        NSString *desc = [self my_description];
        desc = [NSString stringWithCString:[desc cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];
        return desc;
    }
    

    完美结果

    (lldb) po dict
    {
        key1 = abc;
        key2 = "中文";
    }
    
    2016-12-20 14:41:25.558 TSUnicodeFormant[56284:1805511]  
     dict = {
        key1 = abc,
        key2 = 中文
    } 
     array = [
        abc,
        中文
    ]
    (lldb) 
    

    Demo

    git地址TSUnicodeFormant

    相关文章

      网友评论

          本文标题:iOS解NSArray,NSDictionary unicode

          本文链接:https://www.haomeiwen.com/subject/isrhtxtx.html