文档章节

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

hejunbinlan
 hejunbinlan
发布于 2015/06/04 21:47
字数 433
阅读 6670
收藏 1

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

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]);


本文转载自:http://itony.me/916.html

hejunbinlan
粉丝 42
博文 596
码字总数 21569
作品 0
浦东
高级程序员
私信 提问
加载中

评论(1)

C
Coder_HH
学习了。

NSLog的话重写descriptionWithLocale:就好了,这样的话也不用方法交换,在locale里调用description。
Cocos移植到Android的一些问题-中文乱码问题

Android平台版本和设备碎片化很严重,因此从Win32平台移植到Android平台会有很多问题,下面是我们归纳的从Win32平台移植到Android平台遇到的一些问题。 在Android平台中文乱码并不是一个问题...

智捷课堂
2014/11/16
0
0
fstream类读取UTF-8、Unicode和ANSI文本文档乱码问题的解决方案

1、解决UTF-8类型的文本文档中文乱码读取(思路:将UTF-8转成Unicode然后再转ANSI) #include <fstream> #include <iostream> #include <string> // #include <afx.h> #include <Windows.h> ......

Yong_Luo
2011/05/28
0
1
深入理解苹果系统(Unicode)字符串的排序方法

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由iminder发表于云+社区专栏 Unicode编码 我们知道计算机是不能直接处理文本的,而是和数字打交道。因此,为了表示文本,就建...

腾讯云加社区
2018/11/20
0
0
mysql utf8mb4与emoji表情

MYSQL 5.5 之前, UTF8 编码只支持1-3个字节,只支持BMP这部分的unicode编码区, BMP是从哪到哪,到http://en.wikipedia.org/wiki/MappingofUnicodecharacters这里看,基本就是0000~FFFF这一...

铂金大雕
2013/08/17
0
5
判定文件编码或文本流编码的方法

在程序中,文本文件经常用来存储标准的ASCII码文本,比如英文、加减乘除等号这些运算符号。文本文件也可能用于存储一些其他非ASCII字符,如基于GBK的简体中文,基于GIG5的繁体中文等等。在存...

Counterfeit
2013/03/16
0
2

没有更多内容

加载失败,请刷新页面

加载更多

Spring Boot 2 快速教程:WebFlux 集成 Mongodb(四)

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠BYSocket 」欢迎关注和转载,保留摘要,谢谢! 这是泥瓦匠的第104篇原创 文章工程: * JDK 1.8 * Maven 3.5.2 * Spring Boot 2.1....

泥瓦匠BYSocket
43分钟前
3
0
$_ENV

$_ENV数组中的内容是在PHP解析器运行时,从PHP所在服务器中的环境变量, 导入到PHP的全局命名空间, 转变为PHP全局变量。 这些变量很多是由支持 PHP 运行的 Shell 提供的,并且不同的系统很可能...

vinci321
58分钟前
2
0
Guava RateLimiter + AOP注解实现单机限流、统计QPS

1、基于springboot项目pom.xml添加如下依赖: <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency><d......

铁骨铮铮
今天
3
0
JAVA NIO Connection reset by peer 异常

客户端主动断开与服务端的连接,但是如果客户端掉线,服务端就接收不到了。。 异常信息 java.io.IOException: Connection reset by peerat java.base/sun.nio.ch.FileDispatcherImpl.read...

Jeremy_pan
今天
2
0
龙芯版办公软件下载

金山wps office   rpm包:http://ftp.loongnix.org/os/loongnix/1.0/os/Packages/w/wps-office-10.8.0.6472-1.a20p1.mips64el.rpm   deb包:http://packages.deepin.com/loongson/pool/......

gugudu
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部