美文网首页
iOS NSDictionary 输出中文字符”乱码”(Unic

iOS NSDictionary 输出中文字符”乱码”(Unic

作者: hou_8 | 来源:发表于2016-10-31 16:52 被阅读269次

    简单定义一个字典,输出结果:

    NSDictionary*dic=@{

    @"我是中文字符":@"223333",

    @"aaa":@{

    @"aaa":@"啦啦啦"

    }

    };

    NSLog(@"%@",dic);

    将会看到这样的“乱码”,这种现象经常在调试服务端返回 JSON 结果的时候遇到:

    2015-02-2519:23:40.346XXXX[13273:417921]{

    aaa={

    aaa="\U5566\U5566\U5566";

    };

    "\U6211\U662f\U4e2d\U6587\U5b57\U7b26"=223333;

    }

    其实这个是 Unicode 编码的表示方法。顺便简单了解下 Unicode 编码:

    \uxxxx这种格式是Unicode写法,表示一个字符,其中xxxx表示一个16进制数字,范围所0~65535.

    Unicode十六进制数只能包含数字0~9、大写字母A~F或者小写字母A~F。需要注意到是:Unicode的大小端问题,一般都是小端在前,例如

    \u5c0f 表示汉语中的 ‘小’字,转换成10进制就是9215,所以在byte数组中应该是1592. (引自\u Unicode和汉字转化)

    解决的方案是将输出的字符串重新编码。为了一劳永逸,可以直接使用 Method swizzing 替换原函数。操作如下:

    定义文件 NSDictionary+Unicode.m

    @implementation NSDictionary (Unicode)

    - (NSString*)my_description {

    NSString *desc = [self my_description];

    desc = [NSString stringWithCString:[desc cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];

    return desc;

    }

    @end

    首先在项目导入JRSwizzle库,在AppDelegate.m的didFinishLaunchingWithOptions方法中添加代码,替换原有description方法:

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

    完成替换,在调试时使用 po 命令输出即可看到中文输出:

    (lldb)podic

    {

    aaa={

    aaa="啦啦啦";

    };

    "我是中文字符"=223333;

    }

    遗留问题

    直接使用NSLog(@"%@", dic);仍然会显示乱码,原因还不清楚。临时解决办法是使用NSLog(@"%@", [dic description]);。

    参考地址:https://my.oschina.net/hejunbinlan/blog/425034
     

    相关文章

      网友评论

          本文标题:iOS NSDictionary 输出中文字符”乱码”(Unic

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