#iOS 打印中文字典,數(shù)組,控制臺(tái)輸出中文,并保持縮進(jìn)格式

為了方便調(diào)試我們經(jīng)常需要在控制臺(tái)打印數(shù)組/字典信息,但是如果含有中文,打印出來的就是一堆看不懂的信息(其實(shí)是Unicode編碼),影響開發(fā)效率.
本文目標(biāo):

  • 使用NSLog能打印中文字典/數(shù)組
  • 在控制臺(tái)使用 po 命令 顯示的調(diào)試信息也是中文的

2016-12-2 更新

  • 支持對(duì)控件的打印,比如view.subviews
  • 運(yùn)用的是方法交換,只是對(duì)系統(tǒng)的debugDescription方法做轉(zhuǎn)碼處理,因此格式保留為系統(tǒng)風(fēng)格
  • 只在DEBUG模式下有效,對(duì)線上版本無干擾

效果:

用NSLog打印效果
用NSLog打印效果
控制臺(tái)使用po命令效果
控制臺(tái)使用po命令效果

如何使用

直接拖進(jìn)項(xiàng)目中去即可.非常簡(jiǎn)單.

解決NSLog打印中文問題

對(duì)于NSLog能打印中文字典/數(shù)組這個(gè)問題,首先看看網(wǎng)上的普通做法: 就是重新寫一個(gè)字典和數(shù)組的分類,重寫他們的- (NSString *)descriptionWithLocale:(id)locale這個(gè)方法
代碼如下:

@implementation NSDictionary (Log)  
- (NSString *)descriptionWithLocale:(id)locale  
{  
    NSMutableString *string = [NSMutableString string];  
      
    // 開頭有個(gè){  
    [string appendString:@"{\n"];  
      
    // 遍歷所有的鍵值對(duì)  
    [self enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOLBOOL *stop) {  
        [string appendFormat:@"\t%@", key];  
        [string appendString:@" : "];  
        [string appendFormat:@"%@,\n", obj];  
    }];  
      
    // 結(jié)尾有個(gè)}  
    [string appendString:@"}"];  
      
    // 查找最后一個(gè)逗號(hào)  
    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];  
      
    // 開頭有個(gè)[  
    [string appendString:@"[\n"];  
      
    // 遍歷所有的元素  
    [self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOLBOOL *stop) {  
        [string appendFormat:@"\t%@,\n", obj];  
    }];  
      
    // 結(jié)尾有個(gè)]  
    [string appendString:@"]"];  
      
    // 查找最后一個(gè)逗號(hào)  
    NSRange range = [string rangeOfString:@"," options:NSBackwardsSearch];  
    if (range.location != NSNotFound)  
    [string deleteCharactersInRange:range];  
      
    return string;  
}  性能呢
  
@end  

```
這樣做可以解決問題,但是存在個(gè)問題:
* 打印出來的格式不規(guī)范,看起來別扭,括號(hào),大括號(hào)位置基本沒法對(duì)上.

說說我的思路:基本上和上面的一致,需要重寫`- (NSString *)descriptionWithLocale:(id)locale`這個(gè)方法,不同的是,直接調(diào)用`self的description`方法,然后對(duì)返回的字符串進(jìn)行處理,將其轉(zhuǎn)換為中文.
代碼如下:
給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就能打印出規(guī)范的中文了,效果如下:

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

####解決控制臺(tái)調(diào)試命令`po`出來的不是中文問題:
方案和上面的基本差不多,能用系統(tǒng)的方法就用系統(tǒng)的,畢竟系統(tǒng)的穩(wěn)定,速度快.
原理:使用'po'命令會(huì)調(diào)用`debugDescription`這個(gè)方法,這個(gè)返回調(diào)試環(huán)境下的信息,不建議重寫`description`這個(gè)方法.
代碼如下:

```
- (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%7CimageView2/2/w/1240)

附上最終github鏈接直接拖到項(xiàng)目中即可使用:<https://github.com/iOSSinger/CNLog>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異妻往,居然都是意外死亡稍浆,警方通過查閱死者的電腦和手機(jī)载碌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來衅枫,“玉大人嫁艇,你說我怎么就攤上這事∠伊茫” “怎么了步咪?”我有些...
    開封第一講書人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)益楼。 經(jīng)常有香客問我猾漫,道長(zhǎng),這世上最難降的妖魔是什么感凤? 我笑而不...
    開封第一講書人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任悯周,我火速辦了婚禮,結(jié)果婚禮上陪竿,老公的妹妹穿的比我還像新娘禽翼。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開白布闰挡。 她就那樣靜靜地躺著锐墙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪长酗。 梳的紋絲不亂的頭發(fā)上溪北,一...
    開封第一講書人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音花枫,去河邊找鬼刻盐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛劳翰,可吹牛的內(nèi)容都是我干的敦锌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼佳簸,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼乙墙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起生均,我...
    開封第一講書人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤听想,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后马胧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體汉买,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年佩脊,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛙粘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡威彰,死狀恐怖出牧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情歇盼,我是刑警寧澤舔痕,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站豹缀,受9級(jí)特大地震影響伯复,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜邢笙,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一啸如、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鸣剪,春花似錦组底、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至铛纬,卻和暖如春厌均,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背告唆。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工棺弊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人擒悬。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓模她,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親懂牧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子侈净,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 原地址http://segmentfault.net/a/1190000000444620 iOS開發(fā)之玩轉(zhuǎn)字符串...
    如煙Lb閱讀 5,187評(píng)論 0 5
  • *面試心聲:其實(shí)這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個(gè)offer,總結(jié)起來就是把...
    Dove_iOS閱讀 27,125評(píng)論 29 470
  • 設(shè)計(jì)模式是什么? 你知道哪些設(shè)計(jì)模式僧凤,并簡(jiǎn)要敘述畜侦?設(shè)計(jì)模式是一種編碼經(jīng)驗(yàn),就是用比較成熟的邏輯去處理某一種類型的事...
    irenb閱讀 5,183評(píng)論 1 20
  • 1,Search Bar 怎樣去掉背景的顏色(storyboard里只能設(shè)置background顏色躯保,可是發(fā)現(xiàn)cl...
    以德扶人閱讀 2,331評(píng)論 2 50
  • 每天晚上旋膳,下自習(xí)后回到宿舍,我都會(huì)坐在那張斑駁的靠背木椅上途事,呆滯的看著手機(jī)验懊,逛著空間或是朋友圈,向來反復(fù)盯孙,每一天似...
    迷之笑容閱讀 280評(píng)論 0 0