澳门威利斯人_威利斯人娱乐「手机版」

来自 澳门威利斯人 2020-02-03 14:51 的文章
当前位置: 澳门威利斯人 > 澳门威利斯人 > 正文

让NSLog打印字典显示得更好看,并保持缩进格式

总的说来这段日子有关插件开拓也没任何文化可享受的,就近期来说,作者认为供给贯彻那几个须要,然后找具备近乎需要的插件直接去看源码,比去看布告名字猜测来的更实在一些。假如有关于插件开荒这一块的大神辅导,笔者也很乐意受教。末了附上插件(让Xcode援救中文的出口)地址以供就学,代码不会细小略,就一百行左右的代码

实际依旧足以知晓这一个Unicode编码是怎么意思的。平常作者超出这种场馆会复制那堆Unicode的代码到在线网址上进展转码查看。不过依旧以为不太方便。

图片 1利用在线网址进行Unicode转码

怎么样运用

直白拖进项目中去就能够.特别轻便.

当中基本代码是叫三个IDEConsoleItem的类,这么些类是历次调节台出口消息的时候调用的,实例化的艺术是initWithAdaptorType:content:kind:。豆蔻年华早先自身是写了method_exchangeImplementations换到落成,然后在切入生龙活虎套逻辑,根据KVC取出content里的内容,然后在进展Unicode转码,转码过后的字符串在应用KVC重新赋值content即可。

图片 2遍历key/value对,重新拼接输出字符串

为了有助于调节和测量试验我们平日必要在调整台打字与印刷数组/词典新闻,但是即使带有普通话,打字与印刷出来的就是一群看不懂的音讯(其实是Unicode编码State of Qatar,影响开采功能.
本文目的:

唯独,插件开采是不开放的,而苹果官方文书档案也还未有。而英特网提交超越56%提议都以收获具有的布告名,然后依据名字去猜那个通告是做哪些的。这样在付出进程中也是不小的拦截,而小编的需假诺让调节台把Unicode编码转成汉语,所以小编直接去看了人家写的开源,找小编必要有关的代码。而基本代码则是参照的MCLog插件(过滤调节台区域的插件)。

效果:

图片 3

用NSLog打字与印刷效果

图片 4

调节台使用po命令效果

//保存原有的IMPIMP_IDEConsoleItem_initWithAdaptorType = method_getImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:))); //设置新的IMP method_setImplementation(class_getInstanceMethod(NSClassFromString(@"IDEConsoleItem"), @selector(initWithAdaptorType:content:kind:)), class_getMethodImplementation([P_ZXP_IDEConsoleItem class], @selector(initWithAdaptorType:content:kind:)));

实在代码超级轻便,简单到匪夷所思。分类里面就独有10多行代码。

2016-12-2 更新

  • 援救对控件的打字与印刷,例如view.subviews
  • 利用的是措施调换,只是对系统的debugDescription方法做转码管理,因而格式保留为系统风格
  • 只在DEBUG格局下有效,对线上版本无压抑
- initWithAdaptorType:arg1 content:arg2 kind:arg3{ id (id,SEL,id,id,int) = IMP_IDEConsoleItem_initWithAdaptorType; id item = execIMP(self, _cmd, arg1, arg2, arg3); if (kZXPIsDecodeInConsole) { NSString *logText = [item valueForKey:@"content"]; NSString *resultText = [ZXPUnicodeDecodePlugsForXcode convertUnicode:logText]; [item setValue:resultText forKey:@"content"]; } return item;}
  • 应用NSLog能打字与印刷汉语字典/数组
  • 在调整台使用 po 命令 显示的调节和测验音讯也是中文的

由于Xcode的调节台不补助数组和辞典里的国语的值输出(更规范的正是输出为Unicode编码),那让开辟者在打印数据开展调度的时候特别不便利也非常不爽。故此写了一个Category来化解这一个主题素材(github地址点此)。只要把分类拖入到花色里就能够让数组和辞书里的国语打印正常。

啊,NSArray分类里面包车型大巴代码也是第一毛纺织厂相同的。所以打字与印刷NSArray也能像NSDictionary同样使用JSON格式输出,何况能够正常彰显中文。相当少说了。

除恶务尽NSLog打印普通话题目

对此NSLog能打印汉语字典/数组那些主题素材,首先会见网络的常备做法: 便是重新写二个词典和数组的分类,重写他们的- (NSString *)descriptionWithLocale:(id)locale本条点子
代码如下:

@implementation NSDictionary (Log)  
- (NSString *)descriptionWithLocale:(id)locale  
{  
    NSMutableString *string = [NSMutableString string];  

    // 开头有个{  
    [string appendString:@"{n"];  

    // 遍历所有的键值对  
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOLBOOL *stop) {  
        [string appendFormat:@"t%@", key];  
        [string appendString:@" : "];  
        [string appendFormat:@"%@,n", obj];  
    }];  

    // 结尾有个}  
    [string appendString:@"}"];  

    // 查找最后一个逗号  
    NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];  
    if (range.location != NSNotFound)  
    [string deleteCharactersInRange:range];  

    return string;  
}  
@end  

@implementation NSArray (Log)  

- (NSString *)descriptionWithLocale:(id)locale  
{  
    NSMutableString *string = [NSMutableString string];  

    // 开头有个[  
    [string appendString:@"[n"];  

    // 遍历所有的元素  
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {  
        [string appendFormat:@"t%@,n", obj];  
    }];  

    // 结尾有个]  
    [string appendString:@"]"];  

    // 查找最后一个逗号  
    NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];  
    if (range.location != NSNotFound)  
    [string deleteCharactersInRange:range];  

    return string;  
}  性能呢

@end  

```
这样做可以解决问题,但是存在个问题:
* 打印出来的格式不规范,看起来别扭,括号,大括号位置基本没法对上.

说说我的思路:基本上和上面的一致,需要重写`- (NSString *)descriptionWithLocale:(id)locale`这个方法,不同的是,直接调用`self的description`方法,然后对返回的字符串进行处理,将其转换为中文.
代码如下:
给NSString写的分类处理Unicode的编码
```
- (NSString *)unicodeString{

    NSString *tempStr1 = [self stringByReplacingOccurrencesOfString:@"\u" withString:@"\U"];

    NSString *tempStr2 = [tempStr1 stringByReplacingOccurrencesOfString:@""" withString:@"\""];

    NSString *tempStr3 = [[@""" stringByAppendingString:tempStr2] stringByAppendingString:@"""];

    NSData *tempData = [tempStr3 dataUsingEncoding:NSUTF8StringEncoding];


     NSPropertyListFormat format = NSPropertyListOpenStepFormat;

     NSString *returnStr = [NSPropertyListSerialization propertyListWithData:tempData options:NSPropertyListImmutable format:&format error:nil];



    return [returnStr stringByReplacingOccurrencesOfString:@"\r\n" withString:@"n"];


}
```
给NSDictionary和NSArray写的分类中:

```
- (NSString *)descriptionWithLocale:(id)locale{
    return self.description.unicodeString;
}

```
到此,用NSLog就能打印出规范的中文了,效果如下:

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1666610-d20ac35500d0fca3.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

####解决控制台调试命令`po`出来的不是中文问题:
方案和上面的基本差不多,能用系统的方法就用系统的,毕竟系统的稳定,速度快.
原理:使用'po'命令会调用`debugDescription`这个方法,这个返回调试环境下的信息,不建议重写`description`这个方法.
代码如下:

```
- (NSString *)descriptionWithLocale:(id)locale{
    return self.description.unicodeString;
}
- (NSString *)debugDescription{
    return self.description.unicodeString;
}

```
到此,使用`po`命令就可以查看包含中文的信息了.

![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1666610-18505aeae078ea48.png?imageMogr2/auto-orient/strip|imageView2/2/w/1240)

附上最终github链接直接拖到项目中即可使用:<https://github.com/iOSSinger/CNLog>

而是,起码我感到依旧挺辛劳的。所以凭着兴趣切磋了眨眼间间插件开辟,并策画把这几个小须求整成二个插件。然后装在Xcode里一劳永逸。

图片 5直接将那四个分类拉入到工程中就能够使用

IMP代码

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

图片 6关于Xcode的插件已经数以万计了。但小编凭着兴趣也小有色金属钻探所究了须臾间。

上边的章程不恐怕管理缩进格式难题,大家事情发生在此以前提过,使用- (NSString *)descriptionWithLocale:locale indent:(NSUInteger)level主意是有缩进参数的,所以能够选拔那么些方法能够将缩进格式搞出来。看了下认为还不易。不过有个小劣势,使用po参数调节和测验的时候就不曾艺术了。七个艺术分写是在NSArray分类和NSDictionary分类里面完结的。代码如下:

关于插件开辟入门教程网络也可能有数不尽。简单来说概况正是先安装Xcode-Plugin-Template接下来再新建三个project的时候选取xcode plugin如此那般就把插件开辟的核心框架给搭好了。(Xcode-Plugin-Template传输门)

小说的初志很简单,是为了能够健康突显打字与印刷出辞书里面包车型大巴普通话。因为暗中认可情状下,间接打字与印刷辞书的话,在Xcode调控台上,普通话会是乱码的,必要Unicode转码才干看出中文。比如打字与印刷上面包车型客车三个词典

唯独...差强人意,崩溃了。还不知道为啥,然后小编尝试了瞬间method_getImplementation先把IDEConsoleIteminitWithAdaptorType:content:kind:的IMP达成给保存起来,然后在method_setImplementation再次安装它的IMP,在新的IMP里调用原有IMP,然后在Unicode转码,既然就没报错了。。。主旨参照他事他说加以侦查代码如下:

除了 - (NSString *)descriptionWithLocale:locale办法之外,还会有三个- (NSString *)descriptionWithLocale:locale indent:(NSUInteger)level方式。那七个方法效果是同等的,前者多了三个indent参数。作者测验过那八个办法的优先级,开采前后测量试验的结果有一点冲突,所以就懒得理,三个都完成了。

再有其它后生可畏种格局,这种情势的思量是,上边第风流洒脱种办法未有缩进格式,看起来特别不爽,可是系统私下认可的贯彻方式是有缩进格式的。只是汉语呈现有标题罢了。那自个儿直接把暗中认可情势中要出口的字符串实行Unicode转变,将其转变为华语不就可以了?具体代码就不贴了,风乐趣能够看下那篇随笔这种措施的确有效,跟原来的出口的必定要经过的道路分裂就是将Unicode字符串转变为了中文字符串显示。但是有三个破绽,这正是在将私下认可方式的Unicode字符串转变为华语字符串显示的时候,轻松出标题。因为转码在此以前是亟需暴力替换的,那个替换进度是十分轻松出题指标。举例假使词典的value字符串里面原来就有" "标识,那转码就出标题了。

本文由澳门威利斯人发布于澳门威利斯人,转载请注明出处:让NSLog打印字典显示得更好看,并保持缩进格式

关键词: O 插件 Xcode 乱码 中文