1. 程式人生 > >iOS開發 解決Xcode9的Log日誌無法輸出中文的問題

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