没有标准化字符串的后果(IOS)
对于NSString肯定会经常用到,谈谈最近在项目中遇到的一个奇特的现象。如下:
我们知道文件系统的命名都是用的字符串,比如你给文件取名“a.pdf”,然后保存文件后,那个文件的名字就真的是 "a.pdf"吗?
假如有一个文件夹 folderName,他里面包含一个文件 fileName.........然后我们得到一个包含许多文件名的数组
NSFileManager* fileManager = [NSFileManagerdefaultManager];
NSError* error;
NSArray* fileList = [fileManager contentsOfDirectoryAtPath:folderName error:&error];
此时你
if(![fileList containsObject: fileName]) {
NSLog(@"error!");
}
那这个error一定不会出现吗?? 不一定吧!!!!
最近在项目中我们就遇到了这样的事情, debug是查看的这个文件一定是存在的,但 [fileList containsObject: fileName] 判断就是错误,
你也许会说是不是苹果的函数 containsObject 有问题了,
但如果你将字符串标准化了,就不会出现问题了,
怎样标准化??
CFStringNormalize((CFMutableStringRef)fileName, kCFStringNormalizationFormD);
苹果上也提过,当字符串设计到文件名时,这就要注意标准化了
上面函数的解释:
/*!
@function CFStringNormalize
Normalizes the string into the specified form as described in
Unicode Technical Report #15.
@param theString The string which is to be normalized. If this
parameter is not a valid mutable CFString, the behavior is
undefined.
@param theForm The form into which the string is to be normalized.
If this parameter is not a valid CFStringNormalizationForm value,
the behavior is undefined.
*/
CF_EXPORTvoid CFStringNormalize(CFMutableStringRef theString, CFStringNormalizationForm theForm);
第二个参数的解释:
/*!
@typedef CFStringNormalizationForm
This is the type of Unicode normalization forms as described in
Unicode Technical Report #15. To normalize for use with file
system calls, use CFStringGetFileSystemRepresentation().
*/
typedef CF_ENUM(CFIndex, CFStringNormalizationForm) {
kCFStringNormalizationFormD = 0, // Canonical Decomposition
kCFStringNormalizationFormKD, // Compatibility Decomposition
kCFStringNormalizationFormC, // Canonical Decomposition followed by Canonical Composition
kCFStringNormalizationFormKC // Compatibility Decomposition followed by Canonical Composition
};
所以,但判断fileList是否包含某个对象时最好这样写
if(![fileList containsObject: copyfileName]) {
CFStringNormalize((CFMutableStringRef)copyfileName, kCFStringNormalizationFormD);
if(![fileList containsObject: copyfileName]) {
NSLog(@"error!");
}
}
........
没有标准化字符串的后果(IOS)的更多相关文章
- iOS --------Crash 分析(一)
iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...
- 7.Java中的字符串
1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...
- iOS 在UILabel显示不同的字体和颜色(转)
转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...
- iOS 在UILabel显示不同的字体和颜色
转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...
- NSMutableAttributedString iOS 在UILabel显示不同的字体和颜色(转)
在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串,在iOS 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的attr ...
- iOS之文本属性Attributes的使用
1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont systemFontOfSize:_fontS ...
- iOS崩溃日志分析-b
1名词解释 1.1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID,目的是为了唯一识别这个文件. 1.2. dwarfdump 苹果提供的命令行工具,其中一些功能就是查 ...
- NSString/NSMutable字符串——韩俊强…
1.OC基本数据类型(简单铺垫) // NSInteger 在64 位下相当于long,在非64位下相当于 int: // CGFloat 在64位下相当于double 在非64位下相当 ...
- IOS菜鸟学习
1.NS是系统库.2.IOS类的声明:@interface MyObject : NSObject { int memberVar1; // 实体变量 id memberVar2;} + ...
随机推荐
- POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)
解决报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了.., 老师觉得这种两个学生不是一对: 身高 ...
- poj3070--Fibonacci(矩阵的高速幂)
Fibonacci Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9650 Accepted: 6856 Descrip ...
- C#操作 Advantage Database Server 数据库
相关下载 http://devzone.advantagedatabase.com/dz/content.aspx?key=31 1.安装数据库: Advantage Database Server ...
- JavasScript实现调查问卷插件
原文:JavasScript实现调查问卷插件 鄙人屌丝程序猿一枚,闲来无事,想尝试攻城师是感觉,于是乎搞了点小玩意.用js实现调查问卷,实现了常规的题型,单选,多选,排序,填空,矩阵等. 遂开源贴出来 ...
- 浅谈JavaScript性能
最近在JavaScript性能方面有所感悟,把我的经验分给大家: 说到JavaScript,就不得不说它的代码的运行速度—— 在我初学JavaScript的时候,只是觉得它是一个很强大的脚本.渐渐的, ...
- Linux C 多线程
原文:Linux C 多线程 linux下C语言多线程编程 #include <pthread.h> #include <stdio.h> #include <sys/t ...
- ORACLE PL/SQL编程之八:把触发器说透
原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...
- leetcode第四题--Add Two Numbers
Problem: You are given two linked lists representing two non-negative numbers. The digits are stored ...
- 【MS SQL】数据库维护计划之数据库备份(二)
原文:[MS SQL]数据库维护计划之数据库备份(二) 上篇[MS SQL]数据库维护计划之数据库备份(一) 说了数据库备份的一些概念后,这篇以HRP_KQYY数据库备份为例,进行备份计划设置. 考虑 ...
- MVC程序中实体框架的连接恢复和命令拦截
MVC程序中实体框架的连接恢复和命令拦截 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC ...