在開發中列印 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列印的文字是這個方法返回的
複製程式碼
可以看看下面的圖。
使用po命令呼叫description, 用NSLog列印,呼叫- (NSString *)descriptionWithLocale:(nullable id)locale; 方法。- (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)。 ##總結:解決這個問題的關鍵應該是演算法,對遞迴演算法不熟的同學,可以到網上搜尋一下。 Demo地址