首页 > 移动平台 > 详细

解决 iOS NSDictionary 输出中文字符”乱码”(Unicode编码)问题

时间:2015-06-04 22:56:10      阅读:787      评论:0      收藏:0      [点我收藏+]

简单定义一个字典,输出结果:

NSDictionary *dic = @{

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

                      @"aaa": @{

                                @"aaa": @"啦啦啦"

                              }

                      };

NSLog(@"%@", dic);

将会看到这样的“乱码”,这种现象经常在调试服务端返回 JSON 结果的时候遇到:

2015-02-25 19:23:40.346 XXXX[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) po dic

{

    aaa =     {

        aaa = "啦啦啦";

    };

    "我是中文字符" = 223333;

}

遗留问题

直接使用 NSLog(@"%@", dic); 仍然会显示乱码,原因还不清楚。临时解决办法是使用NSLog(@"%@", [dic description]);


解决 iOS NSDictionary 输出中文字符”乱码”(Unicode编码)问题

原文:http://my.oschina.net/hejunbinlan/blog/425034

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!