Xcode 控制台打印Unicode字符串转换为中文
在Xcode的控制台里直接打印一个数组或者字典,输出的都是一些Unicode的编码,不方便调试. 要想看到中文,则要去获取对应的key或者数组下标.得到具体某一个对象才能看到中文,给我们调试起来很不方便.
而现在可以使用LYLUnicode输出中文, 使用也方便.代码也简洁,就几行代码. 直接把LYLUnicode拖到工程里就能让Xcode支持中文的输出了.
就这么简单的一行输出,不需要任何更改.,使用之前Xcode控制台是打印的Unicode编码, 把LYLUnicode拖进来之后,不做任何操作,输出的内容就是我们想看到的中文了.
LYLUnicode的原理比较简单, 代码也很简洁,几行代码,轻轻松松看懂.
原理就是利用runtime替换原有的description和descriptionWithLocale:
还有descriptionWithLocale:indent:这几个方法.并转成让Xcode支持中文的编码.
编码转换代码:
- (NSString *)stringByReplaceUnicode:(NSString *)unicodeString
{
NSMutableString *convertedString = [unicodeString mutableCopy];
[convertedString replaceOccurrencesOfString:@"\\U" withString:@"\\u" options: range:NSMakeRange(, convertedString.length)];
CFStringRef transform = CFSTR("Any-Hex/Java");
CFStringTransform((__bridge CFMutableStringRef)convertedString, NULL, transform, YES); return convertedString;
}
category
手动调用了,但还是需要引用头文件,不方便。所以需要做Method Swizzling
,替换掉系统的description相关方法,在自定义交换方法中添加如上述代码类似的编码转换操作,一劳永逸(。◕ฺ∀◕ฺ)。具体可以是对NSDictionary
、NSArray
以及NSSet
作一个category
,在类被初始加载调用load
方法时做Method Swizzling
:@implementation NSDictionary (LYLUnicode) + (void)load {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
Class class = [self class];
LYL_swizzleSelector(class, @selector(description), @selector(LYL_description));
LYL_swizzleSelector(class, @selector(descriptionWithLocale:), @selector(LYL_descriptionWithLocale:));
LYL_swizzleSelector(class, @selector(descriptionWithLocale:indent:), @selector(LYL_descriptionWithLocale:indent:));
});
} - (NSString *)LYL_description {
return [[self LYL_description] stringByReplaceUnicode];
} - (NSString *)LYL_descriptionWithLocale:(nullable id)locale {
return [[self LYL_descriptionWithLocale:locale] stringByReplaceUnicode];
} - (NSString *)LYL_descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level {
return [[self LYL_descriptionWithLocale:locale indent:level] stringByReplaceUnicode];
} @end
swizzleSelector
中交换了两个方法的实现。所以方法中调用zx_descriptionWithLocale:indent:
其实是调用的原生的descriptionWithLocale:indent:
方法。在系统方法返回时,进行编码转换就OK啦(。◕ฺ∀◕ฺ)。
原生的descriptionWithLocale:indent:
方法是这样获取描述的: 如果元素是NSString
对象则直接返回它; 当元素响应descriptionWithLocale:indent:
方法时,调用方法获得该元素的字符串描述; 当元素响应descriptionWithLocale:
方法时,调用方法获得该元素的字符串描述; 如果上述条件都不符合,就会调用该元素的description
方法获取字符串描述。
原生方法执行遍历子元素的时候,还是会调用descriptionWithLocale:indent:
方法来获取子元素的描述,当原生方法被调用时,因方法实现的交换又会执行自定义的交换方法的代码,形成间接递归,上述条件符合时原生方法会返回正确描述开始回归,回归时依次进行编码转换。这样有个小小的问题,就是回归过程中已经被编码转换过的字符串有可能会被重复转换好多次。这里我们交换的是descriptionWithLocale:indent:
这一个原生方法。如果可以的话,可以只交换原生的description
方法,然后输出的时候调一下description
(例如你有个字典dict,这样打印:NSLog(@"%@", dic.description)
), 这么做只是将系统方法返回的最终描述进行了一次编码转换。ps: 如果你不嫌麻烦的话,可以这么用 ๑乛◡乛๑ 。。。
补上Method Swizzling代码:
static inline void LYL_swizzleSelector(Class class, SEL originalSelector, SEL swizzledSelector) {
Method originalMethod = class_getInstanceMethod(class, originalSelector);
Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);
if (class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))) {
class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));
} else {
method_exchangeImplementations(originalMethod, swizzledMethod);
}
}
githud地址:https://github.com/allencelee/LYLUnicode
Xcode 控制台打印Unicode字符串转换为中文的更多相关文章
- [python] 如何将unicode字符串转换为中文
答案:(http://stackoverflow.com/) ps:这个网站解决了我好多问题啊,大家多上 >>>s='\u9648\u4f1f\u9706\u5176\u5b9e\u ...
- 中文转换成Unicode编码 和 Unicode编码转换为中文
前几天,遇到一个问题,就是在浏览器地址栏传递中文时,出现乱码,考虑了一下,解决方式有很多,我还是采用了转换编码的方式,将中文转换为Unicode编码,然后再解码成中文,以下是实现的过程,非常简单! p ...
- PHP:JSON字符串转换为中文,中文转换为JSON字符串
/** * 中文转换为JSON字符串 * @param $chinese_str 中文:可以包含中文字母数字 * @return string */ function json_encode($chi ...
- python 将列表嵌套字典的unicode字符串转换为str格式的字符串的方法
今天在进行django开发的过程中遇到了一个非常棘手的问题, 因为需求原因, 需要将一份数据存为json格式到数据库中, 如下面这种格式: list_1 = [{"name":&q ...
- JavaScript为unicode编码转换为中文
代码laycode - v1.1 关于这样的数据转换为中文问题,常用的以下方法. 1. eval解析或new Function("'+ str +'")() str = eval ...
- 关于在Xcode控制台打印的注意点
注意!!在控制台中打印语句的返回值,这句代码也算是被执行过了一次 比如在下列代码的if语句执行之前,现在控制台打印 [_dataBaseexecuteUpdate:createSql] 的布尔值 if ...
- iOS 控制台打印unicode 转中文汉字 UTF8String
今天查看代码数据结构,就在控台直接打印了,soGa,我看到了什么!!!! 于是乎想到了不对劲,不对呀,之前打印都是 UTF8String的呀,怎么会这样,百思不得其姐,看了一下封装的网络类,SoGa, ...
- scrapy 爬虫返回json格式内容unicode编码转换为中文的问题解决
最近在基于python3.6.5 的环境使用scrapy框架爬虫获取json数据,返回的数据是unicode格式的,在spider里面的parse接口中打印response.text出来如下: cla ...
- Unicode解码转换为中文
Unicode转中文2:Regex.Unescape(string str);str格式:"\uxxxx" ,举例:"\u300d"
随机推荐
- Css选择器(上) 让样式无孔不入
css选择器 一个可以选择样式的工具, 这里适用于无论是内部代码还是外部引用 abc.css 这类型的文件. 基本选择器*{ } 就是一个简单的*, 代表应用于全部. 不适合于个性 ...
- Linux 添加yum命令
第一步,国内的yum仓库 http://mirrors.163.com/centos/7/os/x86_64/Packages/ http://mirrors.aliyun.com/centos/7/ ...
- Shellinabox安装及使用教程
本文转载自: shellinabox:一款使用 AJAX 的基于 Web 的终端模拟器 一.shellinabox简介 通常情况下,我们在访问任何远程服务器时,会使用常见的通信工具如OpenSSH和P ...
- plan,idea,and dream
自学机器学习/数据分析/前端 目前想法是从前端入手,学会写/分析网页及其内容/数据,然后使用爬虫爬取数据,然后用机器学习算法对数据进行处理.哈哈,想法是不是太天真了. 学习都从网上的资料入手,因此发现 ...
- 远景GIS云产品规划
远景GIS云平台在初期有过产品设计,随着研发工作的进行以及对GIS云的认知更进行一步,最近重新梳理了平台的产品规划,使以后的开发不至于走偏方向. GIS云平台的研发也是摸着石头过河,免不了有考虑不到的 ...
- Linked List Cycle 判断一个链表是否存在回路(循环)
Given a linked list, determine if it has a cycle in it. Follow up:Can you solve it without using ext ...
- 一、ionic 图片轮播问题
使用ion-slide可以实现图片轮播,但是如果在html中仅仅增加ion-slide是远远不够的,会出现两个问题:图片加载不出来和图片轮播至最后一个不轮播的问题 1.如何解决图片加载不出来的问题 i ...
- Java基础之创建实例化对象的方式
Java中创建(实例化)对象的五种方式 1.用new语句直接创建对象,这是最常见的创建对象的方法. 2.通过工厂方法返回对象,如:String str = String.valueOf(23); 3 ...
- C# 五大修饰符
修饰符 访问权限 public 关键字是类型和类型成员的访问修饰符. 公共访问是允许的最高访问级别. 对访问公共成员没有限制 private 私有访问是允许的最低访问级别. 私有成员只有在声明它们的类 ...
- [学习笔记] CDQ分治&整体二分
突然诈尸.png 这两个东西好像都是离线骗分大法... 不过其实这两个东西并不是一样的... 虽然代码长得比较像 CDQ分治 基本思想 其实CDQ分治的基本思想挺简单的... 大概思路就是长这样的: ...