在开发中打印 NSDictionary 会出现中文乱码,到网上查了这个问题,发现一篇文章(链接),虽然解决了乱码问题,但是打乱了输出格式,这个买卖可划不来。干脆自己写一个扩展,解决乱码问题。文章最后给出了Demo地址
说说解决中文乱码的原理
1、先介绍3个方法,这是打印NSDictionary、NSArray,时所调用的
- (NSString *)description ;
- (NSString *)descriptionWithLocale:(nullable id)locale;
- (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;
作用与区别
(1)三个方法的作用:
都是将NSDictionary、NSArray对象转化为字符串。
(2)区别
1、- (NSString *)description ;
作用:在控制台使用po 命令时,输出的文字就是这个方法返回的
2、- (NSString *)descriptionWithLocale:(nullable id)locale;
用NSLog方法打印的文字是这个方法返回的
可以看看下面的图。
使用
po
命令调用description
方法, 用NSLog
打印,调用- (NSString *)descriptionWithLocale:(nullable id)locale
方法。3、
- (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;
这个方法和第二个方法相比,多了个 level 参数,代表所打印的文字向右平移 level 个字符(我用的"\t")。
下图中分别是 level 传0 和 2 的情况。
2、了解这三个方法之后,只要写个分类,重写description相关的方法,自己把NSDictionary、NSArray转换成字符串,顺便格式化一下,就可以了。
1、字典中可能会套字典,也可能套数组,数组中也可能套用字典。
以NSDictionary为例分析一下,数组的原理类似。
程序中写了这个方法:
- (NSString *)descriptionWithLevel:(int)level
level最少为 1,代表最外层,如果发现某个key对应的value也是NSDictionary,那么递归调用这个方法,只是,level要传(level + 1)。