iOS NSDictionary 輸出中文字符”亂碼”(Unicode編碼)問題

簡單定義一個字典,輸出結果:

NSDictionary*dic=@{

@"我是中文字符":@"223333",

@"aaa":@{

@"aaa":@"啦啦啦"

}

};

NSLog(@"%@",dic);

將會看到這樣的“亂碼”,這種現象經常在調試服務端返回 JSON 結果的時候遇到:

2015-02-2519:23:40.346XXXX[13273:417921]{

aaa={

aaa="\U5566\U5566\U5566";

};

"\U6211\U662f\U4e2d\U6587\U5b57\U7b26"=223333;

}

其實這個是 Unicode 編碼的表示方法。順便簡單了解下 Unicode 編碼:

\uxxxx這種格式是Unicode寫法,表示一個字符,其中xxxx表示一個16進制數字,范圍所0~65535.

Unicode十六進制數只能包含數字0~9、大寫字母A~F或者小寫字母A~F。需要注意到是:Unicode的大小端問題,一般都是小端在前,例如

\u5c0f 表示漢語中的 ‘小’字,轉換成10進制就是9215,所以在byte數組中應該是1592. (引自\u Unicode和漢字轉化)

解決的方案是將輸出的字符串重新編碼。為了一勞永逸,可以直接使用 Method swizzing 替換原函數。操作如下:

定義文件 NSDictionary+Unicode.m

@implementation NSDictionary (Unicode)

- (NSString*)my_description {

NSString *desc = [self my_description];

desc = [NSString stringWithCString:[desc cStringUsingEncoding:NSUTF8StringEncoding] encoding:NSNonLossyASCIIStringEncoding];

return desc;

}

@end

首先在項目導入JRSwizzle庫,在AppDelegate.m的didFinishLaunchingWithOptions方法中添加代碼,替換原有description方法:

[NSDictionary jr_swizzleMethod:@selector(description) withMethod:@selector(my_description) error:nil];

完成替換,在調試時使用 po 命令輸出即可看到中文輸出:

(lldb)podic

{

aaa={

aaa="啦啦啦";

};

"我是中文字符"=223333;

}

遺留問題

直接使用NSLog(@"%@", dic);仍然會顯示亂碼,原因還不清楚。臨時解決辦法是使用NSLog(@"%@", [dic description]);。

參考地址:https://my.oschina.net/hejunbinlan/blog/425034
?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容