iOS 解决打印 NSDictionary 时,中文乱码问题

1,839 阅读2分钟

在开发中打印 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)、区别

- (NSString *)description ;	
在控制台使用po 命令时,输出的文字就是这个方法返回的
- (NSString *)descriptionWithLocale:(nullable id)locale;  
用NSLog打印的文字是这个方法返回的

可以看看下面的图。

description(po   NSlog).png
使用po命令调用description, 用NSLog打印,调用- (NSString *)descriptionWithLocale:(nullable id)locale; 方法。

- (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;
这个方法和第二个方法相比,多了个 level  参数,代表所打印的文字向右平移  level 个字符(我用的"\t")。

下图中分别是 level 传0 和 2 的情况。

localIndent.png
###2、了解这三个方法之后,只要写个分类,重写description相关的方法,自己把NSDictionary、NSArray转换成字符串,顺便格式化一下,就可以了。 ###1、字典中可能会套字典,也可能套数组,数组中也可能套用字典。 以NSDictionary为例分析一下,数组的原理类似。 程序中写了这个方法:

- (NSString *)descriptionWithLevel:(int)level 

level最少为 1,代表最外层,如果发现某个key对应的value也是NSDictionary,那么递归调用这个方法,只是,level要传(level + 1)。 ##总结:解决这个问题的关键应该是算法,对递归算法不熟的同学,可以到网上搜索一下。 Demo地址