iOS開發 解決Xcode9的Log日誌無法輸出中文的問題
問題描述
Xcode的Log日誌輸出中文的問題,一般都是重寫NSArray,NSDictionary的- (NSString *)descriptionWithLocale:(id)locale;方法進行處理,最近升級到Xcode9會後發現原來的處理邏輯也無法滿足輸出中文的需求,後臺返回的狀態描述涉及到中文的都變成了Unicode編碼,其實這是重寫的方法失效的問題,因為Xcode預設輸出NSArray,NSDictionary的中文都是Unicode編碼
正確的解決方案如下,
建立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];
}
/**
將陣列轉化成字串,文字格式UTF8,並且格式化
@param level 當前陣列的層級,最少為 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;
}
/**
根據層級,返回前面的空格佔位符
@param level 層級
@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];
}
/**
* 非字典時,會引發崩潰
*/
- (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;
}
/**
將字典轉化成字串,文字格式UTF8,並且格式化
@param level 當前字典的層級,最少為 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;
}
/**
根據層級,返回前面的空格佔位符
@param level 字典的層級
@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串,複製log日誌,直接在json格式化工具中使用
參考
相關推薦
iOS開發 解決Xcode9的Log日誌無法輸出中文的問題
問題描述 Xcode的Log日誌輸出中文的問題,一般都是重寫NSArray,NSDictionary的- (NSString *)descriptionWithLocale:(id)locale;方法進行處理,最近升級到Xcode9會後發現原來的處理邏輯也無法
iOS開發 - 解決百度地圖模擬器無法定位問題
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
wprintf、wcout無法輸出中文的解決方案
pau clas category ret str out har stdio.h use 在C語言中,若wprintf無法輸出中文,調用函數setlocale(int category, const char *locale)設置locale即可輸出中文 此方法也可用於C
iOS開發 解決WKWebView載入的h5,無法呼叫撥打電話功能
h5的撥打電話程式碼是 <a href="tel:13112345678">移動WEB頁面JS一鍵撥打號碼諮詢功能</a> UIWebView載入的h5,可以呼叫;但是WKWebView就是不行,找了半天,最後解決,在WKWebView的WKNavi
iOS開發——解決UIScrollView控制元件移動錯位和無法滾動
跟著iOS老師發的教程做了個簡陋的圖片瀏覽器,因為圖片太多展示不開所以想要用Scroll View來顯示,就自己試了一下。然而並沒有自己想象的那麼順利orz 當把要顯示的圖片都放置到Scroll View上時,它還是不會滾動。這時因為沒有設定他的content
ios開發之--系統控件顯示中文
出現 nav ges 進行 code 技術 ava ios urn 雖然一直知道X-code肯定提供有語言本地化的設置地方,但是一直也做個記錄,有些時候的漢化,還是需要使用代碼去控制,鍵盤的右下角、navagiton的return使用代碼修改,調用系統相機時,也是出現英文的
Mac系統 Sublime Text 3 控制臺無法輸出中文該怎麽處理
ioe 輸出 error not encoding [ ] uil 解決 osi 電腦配置 MacBook Pro (Retina, 15-inch, Mid 2015)系統版本 10.13.2 我在本機安裝了sublime text3 為python3.6 配置了一編譯系
iOS開發之崩潰日誌符號化及程式碼定位
提交應用到App Store時如果稽核被拒,可能會發送給我們一個崩潰日誌,如果提示資訊不足以讓我們知道崩潰在哪裡,那就使用以下這種通過定位日誌從而知道崩潰vc與行數。 // 回到你的打包介面 // 找到.dsYM檔案 這時回到iTunes con
解決UbuntuQT5.10無法輸入中文
1. 安裝 fcitx-frontend-qt5, sudo apt-get install fcitx-frontend-qt5 2 ,進入/usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts cd /
mac的sublime text3的python3環境無法輸出中文
Launchpad中進入其他,選擇其中的“終端”輸入which python3,目的是得到python3的路徑如圖所示。然後在sublime text3中選擇Tools-->Build System-->New Build System(最下面一個)輸入如下內容,
iOS開發之Crash日誌獲取與分析
當在非除錯狀態下,我們用真機測試app,crash或者說閃退是一件很常見的事,最讓我們開發人員頭疼的是,自己在開發過程中總是不會遇到crash,安裝到別人的裝置,就出現了閃退崩潰現象。這種偶現的、概率比較低的閃退是最令人頭疼。 這時iOS crash log
ios開發中崩潰日誌log
typedef enum{ QFLogLevelFail = 0, QFLogLevelError, QFLogLevelWarning, QFLogLevelInfo, QFLogLevelDebug }QFLogL
解決Log4j日誌檔案輸出到了前一天的備份檔案裡
最近參與了一個專案,單臺主機上佈置了多個應用例項。為了後期維護和監控,需要將各個應用例項的部分關鍵日誌彙總到一個檔案裡,同時自動備份前一天的日誌,並帶上日期。最開始只是配置了log4j.properties檔案,控制部分日誌輸出級別。發現,日誌正常情況下能輸出
IOS開發-解決demo真機執行不了問題
本人今天弄了一下午終於把開發者賬號新增到公司開發賬戶上了!激動。但當要把一些網上下載的demo在真機上執行看看效果時,又糾結了!(Ps:我在除錯照相機錄影功能,虛擬機器沒攝像功能,大家懂的。所以,必須真機才能看到功能效果)。好吧,廢話了一段!接下來進入正題。 1.首先,
iOS開發-解決頁面卡頓小技巧(很常用)
1).UIImageView儘量設定為不透明 opque儘量設定為YES當UIImageView的opque設定為YES的時候其alpha的屬性就會無效,UIImageView的半透明取決於其圖片半透明或者UIImageView本身的背景色合成的圖層view是半透明的。 如果圖片全部不是半透明就不會觸發圖層
Ubuntu 16.04下解決sublime text3無法輸中文問題
首先介紹一下常規方法。文章最後附有shell一鍵指令碼可供懶人使用。 常規方法 一、系統已成功安裝搜狗輸入法 二、儲存下面的程式碼到檔案sublime_imfix.c(位於~目錄) #include <gtk/gtkimcontext.h&
docker應用輸出中文日誌亂碼,解決過程
用docker部署了一個tomcat應用,並以tomcat使用者執行,日誌輸出遇到中文就顯示 ? dockerfile中已經明確指定了語言的環境變數ENV LC_ALL zh_CN.utf8 進入容
iOS開發 postMan.app使用教程--解決谷歌瀏覽器postman無法使用問題
1.問題 最近發現谷歌瀏覽器的postman無法使用了,網上下載了各種postman.crx外掛都無法正常使用,無意間發現了postman還有Mac和windows版的軟體,使用app,以後再也不用擔心.crx檔案的問題了 2.安裝好postman後註冊
Linux下java程式碼log4j日誌輸出中文出現亂碼,中文全部變成問號,解決辦法
問題描述: (1)log4j.xml和log4j.properties日誌輸出的編碼格式正常都設定為UTF-8 (2)cat命令獲取txt檔案,裡面的中文可以正常顯示 (3)log.***(info)中文全部出現亂碼 原因: linux本地設定的檔案編碼格式不是UT
iOS開發——輸出中文(字典和陣列)
經常用網路請求返回Json資料, 其中字典或者陣列列印輸出中文,非看不懂的Unicode編碼 1.支援NSLog輸出中文 2.支援控制檯po輸出中文 實現方式==》: 1.新建NSDictionary分類 (Xcode8 ) 2.自動生成.h