iOS中解決Xcode9的Log日志無(wú)法輸出中文的問(wèn)題小結(jié)
問(wèn)題描述
Xcode的Log日志輸出中文的問(wèn)題,一般都是重寫NSArray,NSDictionary的- (NSString *)descriptionWithLocale:(id)locale;
方法進(jìn)行處理,最近升級(jí)到Xcode9會(huì)后發(fā)現(xiàn)原來(lái)的處理邏輯也無(wú)法滿足輸出中文的需求,后臺(tái)返回的狀態(tài)描述涉及到中文的都變成了Unicode編碼,其實(shí)這是重寫的方法失效的問(wèn)題,因?yàn)閄code默認(rèn)輸出NSArray,NSDictionary的中文都是Unicode編碼
正確的解決方案如下, 創(chuàng)建NSArray+ZYLog分類
NSArray+ZYLog.h文件
// // NSArray+ZYLog.h // ZYLog // // Created by zhouyu on 17/11/08. // Copyright © 2017年 zhouyu. All rights reserved. // #import <Foundation/Foundation.h> @interface NSArray (ZYLog) @end @interface NSDictionary (ZYLog) @end
NSArray+ZYLog.m文件
// // NSArray+ZYLog.m // ZYLog // // Created by zhouyu on 17/11/08. // Copyright © 2017年 zhouyu. All rights reserved. // #import "NSArray+ZYLog.h" @implementation NSArray (ZYLog) #ifdef DEBUG - (NSString *)description { return [self ZY_descriptionWithLevel:1]; } -(NSString *)descriptionWithLocale:(id)locale{ return [self ZY_descriptionWithLevel:1]; } - (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level { return [self ZY_descriptionWithLevel:(int)level]; } /** 將數(shù)組轉(zhuǎn)化成字符串,文字格式UTF8,并且格式化 @param level 當(dāng)前數(shù)組的層級(jí),最少為 1,代表最外層 @return 格式化的字符串 */ - (NSString *)ZY_descriptionWithLevel:(int)level { NSString *subSpace = [self ZY_getSpaceWithLevel:level]; NSString *space = [self ZY_getSpaceWithLevel:level - 1]; NSMutableString *retString = [[NSMutableString alloc] init]; // 1、添加 [ [retString appendString:[NSString stringWithFormat:@"["]]; // 2、添加 value [self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[NSString class]]) { NSString *value = (NSString *)obj; value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *subString = [NSString stringWithFormat:@"\n%@\"%@\",", subSpace, value]; [retString appendString:subString]; } else if ([obj isKindOfClass:[NSArray class]]) { NSArray *arr = (NSArray *)obj; NSString *str = [arr ZY_descriptionWithLevel:level + 1]; str = [NSString stringWithFormat:@"\n%@%@,", subSpace, str]; [retString appendString:str]; } else if ([obj isKindOfClass:[NSDictionary class]]) { NSDictionary *dic = (NSDictionary *)obj; NSString *str = [dic descriptionWithLocale:nil indent:level + 1]; str = [NSString stringWithFormat:@"\n%@%@,", subSpace, str]; [retString appendString:str]; } else { NSString *subString = [NSString stringWithFormat:@"\n%@%@,", subSpace, obj]; [retString appendString:subString]; } }]; if ([retString hasSuffix:@","]) { [retString deleteCharactersInRange:NSMakeRange(retString.length-1, 1)]; } // 3、添加 ] [retString appendString:[NSString stringWithFormat:@"\n%@]", space]]; return retString; } /** 根據(jù)層級(jí),返回前面的空格占位符 @param level 層級(jí) @return 占位空格 */ - (NSString *)ZY_getSpaceWithLevel:(int)level { NSMutableString *mustr = [[NSMutableString alloc] init]; for (int i=0; i<level; i++) { [mustr appendString:@"\t"]; } return mustr; } #endif @end @implementation NSDictionary (ZYLog) #ifdef DEBUG - (NSString *)description { return [self ZY_descriptionWithLevel:1]; } - (NSString *)descriptionWithLocale:(nullable id)locale { return [self ZY_descriptionWithLevel:1]; } - (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level { return [self ZY_descriptionWithLevel:(int)level]; } /** * 非字典時(shí),會(huì)引發(fā)崩潰 */ - (NSString *)ZY_getUTF8String { if ([self isKindOfClass:[NSDictionary class]] == NO) { return @""; } NSError *error = nil; NSData *data = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:&error]; if (error) { return @""; } NSString *str = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; return str; } /** 將字典轉(zhuǎn)化成字符串,文字格式UTF8,并且格式化 @param level 當(dāng)前字典的層級(jí),最少為 1,代表最外層字典 @return 格式化的字符串 */ - (NSString *)ZY_descriptionWithLevel:(int)level { NSString *subSpace = [self ZY_getSpaceWithLevel:level]; NSString *space = [self ZY_getSpaceWithLevel:level - 1]; NSMutableString *retString = [[NSMutableString alloc] init]; // 1、添加 { [retString appendString:[NSString stringWithFormat:@"{"]]; // 2、添加 key : value; [self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) { if ([obj isKindOfClass:[NSString class]]) { NSString *value = (NSString *)obj; value = [value stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; NSString *subString = [NSString stringWithFormat:@"\n%@\"%@\" : \"%@\",", subSpace, key, value]; [retString appendString:subString]; } else if ([obj isKindOfClass:[NSDictionary class]]) { NSDictionary *dic = (NSDictionary *)obj; NSString *str = [dic ZY_descriptionWithLevel:level + 1]; str = [NSString stringWithFormat:@"\n%@\"%@\" : %@,", subSpace, key, str]; [retString appendString:str]; } else if ([obj isKindOfClass:[NSArray class]]) { NSArray *arr = (NSArray *)obj; NSString *str = [arr descriptionWithLocale:nil indent:level + 1]; str = [NSString stringWithFormat:@"\n%@\"%@\" : %@,", subSpace, key, str]; [retString appendString:str]; } else { NSString *subString = [NSString stringWithFormat:@"\n%@\"%@\" : %@,", subSpace, key, obj]; [retString appendString:subString]; } }]; if ([retString hasSuffix:@","]) { [retString deleteCharactersInRange:NSMakeRange(retString.length-1, 1)]; } // 3、添加 } [retString appendString:[NSString stringWithFormat:@"\n%@}", space]]; return retString; } /** 根據(jù)層級(jí),返回前面的空格占位符 @param level 字典的層級(jí) @return 占位空格 */ - (NSString *)ZY_getSpaceWithLevel:(int)level { NSMutableString *mustr = [[NSMutableString alloc] init]; for (int i=0; i<level; i++) { [mustr appendString:@"\t"]; } return mustr; } #endif @end
效果
而且直接就是json串,復(fù)制log日志,直接在json格式化工具中使用
參考
總結(jié)
以上所述是小編給大家介紹的iOS中解決Xcode9的Log日志無(wú)法輸出中文的問(wèn)題小結(jié),希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
iOS開發(fā)中蘋果輸入手機(jī)號(hào)變用戶的名字
今天我們的用戶輸入手機(jī)號(hào)之后變成了用戶的名字,沒(méi)辦法獲取驗(yàn)證碼,因?yàn)槭謾C(jī)格式不對(duì)。下面通過(guò)本文給大家分享開發(fā)中蘋果輸入手機(jī)號(hào)變用戶的名字,需要的朋友可以參考下2017-05-05iOS應(yīng)用開發(fā)中使用Auto Layout來(lái)適配不同屏幕尺寸
這篇文章主要介紹了iOS應(yīng)用開發(fā)中使用Auto Layout來(lái)適配不同屏幕尺寸的方法,根據(jù)Xcode IDE下的實(shí)際調(diào)試步驟講解其用法,需要的朋友可以參考下2016-03-03iOS實(shí)現(xiàn)封裝一個(gè)獲取通訊錄的工具類詳解
這篇文章主要給大家介紹了關(guān)于iOS如何實(shí)現(xiàn)封裝一個(gè)獲取通訊錄的工具類的相關(guān)資料,這是自己平時(shí)封裝的一個(gè)工具類,使用非常方便,文中給出了詳細(xì)的示例代碼,需要的朋友們可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-10-10iOS 導(dǎo)航欄無(wú)縫圓滑的隱藏 Navigationbar實(shí)例代碼
本文通過(guò)實(shí)例代碼給大家介紹了iOS 導(dǎo)航欄無(wú)縫圓滑的隱藏 Navigationbar的效果,代碼簡(jiǎn)單易懂,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-11-11iOS開發(fā)之?dāng)?shù)字每隔3位用逗號(hào)分隔
以前在做電商app時(shí)經(jīng)常會(huì)針對(duì)稍大的金額展示出來(lái),需要每隔千位添加逗號(hào)便于用戶識(shí)別,下面通過(guò)本文給大家分享ios中數(shù)字每隔3位用逗號(hào)分隔的實(shí)例代碼,需要的朋友參考下吧2017-09-09iOS仿微信搖一搖動(dòng)畫效果加震動(dòng)音效實(shí)例
這篇文章主要介紹了iOS仿微信搖一搖動(dòng)畫效果加震動(dòng)音效實(shí)例,詳細(xì)介紹了微信搖一搖功能的實(shí)現(xiàn)原理,非常具有實(shí)用價(jià)值,需要的朋友可以參考下。2017-03-03iOS開發(fā)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片瀏覽器的實(shí)例講解
這篇文章主要介紹了iOS開發(fā)中實(shí)現(xiàn)一個(gè)簡(jiǎn)單的圖片瀏覽器的實(shí)例講解,代碼基礎(chǔ)傳統(tǒng)的Objective-C,需要的朋友可以參考下2016-01-01iOS開發(fā)中簡(jiǎn)單實(shí)用的幾個(gè)小技巧
大家可能都知道,在開發(fā)過(guò)程中我們總會(huì)遇到各種各樣的小問(wèn)題,有些小問(wèn)題并不是十分容易解決。在此我就總結(jié)一下,我在開發(fā)中遇到的各種小問(wèn)題,以及我的解決方法,也算是些小技巧吧,分享給大家,方便大家在iOS開發(fā)的時(shí)候能夠參考借鑒,下面有需要的朋友一起來(lái)看看吧。2016-11-11