源码

首页 » 归档 » 源码 » iOS让NSLog打印字典显示得更好看(解决中文乱码并显示成JSON格式)

iOS让NSLog打印字典显示得更好看(解决中文乱码并显示成JSON格式)

前言

文章的初衷很简单,是为了能够正常显示打印出字典里面的中文。因为默认情况下,直接打印字典的话,在Xcode控制台上,中文会是乱码的,需要Unicode转码才能看到中文。
比如打印下面的一个字典

NSDictionary *dict = @{
                       @"ArticleTitle":@"【iOS开发】打开另一个APP(URL Scheme与openURL)",
                       @"ArticleUrl":@"https://www.jianshu.com/p/0811ccd6a65d",
                       @"author":@{
                               @"nickName":@"谦言忘语",
                               @"blog":@"https://www.jianshu.com/u/cc2cf725ac0c",
                               @"work":@"iOS工程师"
                               }
                       };
NSLog(@"打印出的字典:%@",dict);

Xcode控制台上显示的是这样子的:

WTF!谁能告诉我,这坨东西是什么玩意儿?!!!


其实还是可以知道这些Unicode编码是什么意思的。平常我遇到这种情况会复制那堆Unicode的代码到在线网站上进行转码查看。但是依然觉得不太方便。

先看看结果

我终于无法忍受这么坑爹的中文显示了,查找一些资料、经过一系列尝试之后,终于找到一个比较满意的解决方案了。先看结果:

最终结果


2018-09-03 15:43:10.046 PrintBeautifulLog[4446:1265987] 打印出的字典:{
  "ArticleTitle" : "【iOS开发】打开另一个APP(URL Scheme与openURL)",
  "ArticleUrl" : "https:////www.jianshu.com//p//0811ccd6a65d",
  "author" : {
    "work" : "iOS工程师",
    "blog" : "https:////www.jianshu.com//u//cc2cf725ac0c",
    "nickName" : "谦言忘语"
  }
}

是不是顿时觉得神清气爽?中文出来了,而且格式也很好看,层次分明。
对了,是不是觉得这个格式似曾相似?
嘿嘿,没错,这个就是JSON格式。不信?我们拿去JSON在线格式化网站上验证下?

JSON格式验证


另外,使用po命令调试打印的时候也是一样的。


po命令调试时也能打印打印出JSON格式的Log


直接将文件拖入到工程中即可使用

这么神奇的效果?怎么做到的?嗯,很简单,直接将github仓库上的这两个分类拉入到工程中就可以了。什么代码都不用写。

直接将这两个分类拉入到工程中即可使用


怎么做到的?

其实代码很简单,简单到难以想象。分类里面就只有10多行代码。

//NSDictionry分类实现文件代码
#import "NSDictionary+Log.h"
@implementation NSDictionary (Log)
#ifdef DEBUG
//打印到控制台时会调用该方法
- (NSString *)descriptionWithLocale:(id)locale{
    return self.debugDescription;
}
//有些时候不走上面的方法,而是走这个方法
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level{
    return self.debugDescription;
}
//用po打印调试信息时会调用该方法
- (NSString *)debugDescription{
    NSError *error = nil;
    //字典转成json
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted  error:&error];
    //如果报错了就按原先的格式输出
    if (error) {
        return [super debugDescription];
    }
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return jsonString;
}
#endif
@end


接下来解释下这段代码:

  • NSLog打印字典(NSDictionary)和数组(NSArray)的时候的时候会走- (NSString *)descriptionWithLocale:(id)locale来决定打印的字符串。打印其他对象(比如NSString类型)的时候会走- (NSString *)description方法。所以现在我们需要重写NSDictionary的- (NSString *)descriptionWithLocale:(id)locale方法来得到我们想要的结果。

  • 在使用po命令调试的时候,会走- (NSString *)debugDescription方法,所以我们需要覆盖该方法来显示出我们想要的结果。

  • - (NSString *)descriptionWithLocale:(id)locale- (NSString *)debugDescription方法里面将字典转化为JSON字符串输入,就能同时在代码调试打印和使用po命令调试打印时都能得到我们想要的结果。

(0)

本文由 投稿者 创作,文章地址:https://blog.isoyu.com/archives/iosrangnslogdayinzidianxianshidegenghaokanjiejuezhongwenluanmabingxianshichengjsongeshi-2.html
采用知识共享署名4.0 国际许可协议进行许可。除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为:10 月 17, 2018 at 09:39 下午

热评文章

发表回复

[必填]

我是人?

提交后请等待三秒以免造成未提交成功和重复