对于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)的更多相关文章

  1. iOS --------Crash 分析(一)

    iOS Crash 分析(文一)- 开始 1. 名词解释 1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID.目的是为了唯一识别这个文件. 2. dwarfdump 苹 ...

  2. 7.Java中的字符串

    1.String的特性 特性一:不可变性 String s=new String("yangyun") s=s.toUpperCase(); 这里的s,s占用的空间是不一样的(地址 ...

  3. iOS 在UILabel显示不同的字体和颜色(转)

    转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...

  4. iOS 在UILabel显示不同的字体和颜色

    转自:http://my.oschina.net/CarlHuang/blog/138363 在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串, ...

  5. NSMutableAttributedString iOS 在UILabel显示不同的字体和颜色(转)

    在项目开发中,我们经常会遇到在这样一种情形:在一个UILabel 使用不同的颜色或不同的字体来体现字符串,在iOS 以后我们可以很轻松的实现这一点,官方的API 为我们提供了UILabel类的attr ...

  6. iOS之文本属性Attributes的使用

    1.NSKernAttributeName: @10 调整字句 kerning 字句调整 2.NSFontAttributeName : [UIFont systemFontOfSize:_fontS ...

  7. iOS崩溃日志分析-b

    1名词解释 1.1. UUID 一个字符串,在iOS上每个可执行文件或库文件都包含至少一个UUID,目的是为了唯一识别这个文件. 1.2. dwarfdump 苹果提供的命令行工具,其中一些功能就是查 ...

  8. NSString/NSMutable字符串——韩俊强…

    1.OC基本数据类型(简单铺垫) //   NSInteger  在64 位下相当于long,在非64位下相当于 int: //    CGFloat 在64位下相当于double  在非64位下相当 ...

  9. IOS菜鸟学习

    1.NS是系统库.2.IOS类的声明:@interface MyObject : NSObject {    int memberVar1; // 实体变量    id  memberVar2;} + ...

随机推荐

  1. POJ2771_Guardian of Decency(二分图/最大独立集=N-最大匹配)

    解决报告 http://blog.csdn.net/juncoder/article/details/38159017 题目传送门 题意: 看到题目我就笑了.., 老师觉得这种两个学生不是一对: 身高 ...

  2. poj3070--Fibonacci(矩阵的高速幂)

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9650   Accepted: 6856 Descrip ...

  3. C#操作 Advantage Database Server 数据库

    相关下载 http://devzone.advantagedatabase.com/dz/content.aspx?key=31 1.安装数据库: Advantage Database Server ...

  4. JavasScript实现调查问卷插件

    原文:JavasScript实现调查问卷插件 鄙人屌丝程序猿一枚,闲来无事,想尝试攻城师是感觉,于是乎搞了点小玩意.用js实现调查问卷,实现了常规的题型,单选,多选,排序,填空,矩阵等. 遂开源贴出来 ...

  5. 浅谈JavaScript性能

    最近在JavaScript性能方面有所感悟,把我的经验分给大家: 说到JavaScript,就不得不说它的代码的运行速度—— 在我初学JavaScript的时候,只是觉得它是一个很强大的脚本.渐渐的, ...

  6. Linux C 多线程

    原文:Linux C 多线程 linux下C语言多线程编程 #include <pthread.h> #include <stdio.h> #include <sys/t ...

  7. ORACLE PL/SQL编程之八:把触发器说透

    原文:ORACLE PL/SQL编程之八:把触发器说透 ORACLE PL/SQL编程之八: 把触发器说透 大家一定要评论呀,感谢!光发表就花了我将近一个下午. 本篇主要内容如下: 8.1 触发器类型 ...

  8. leetcode第四题--Add Two Numbers

    Problem: You are given two linked lists representing two non-negative numbers. The digits are stored ...

  9. 【MS SQL】数据库维护计划之数据库备份(二)

    原文:[MS SQL]数据库维护计划之数据库备份(二) 上篇[MS SQL]数据库维护计划之数据库备份(一) 说了数据库备份的一些概念后,这篇以HRP_KQYY数据库备份为例,进行备份计划设置. 考虑 ...

  10. MVC程序中实体框架的连接恢复和命令拦截

    MVC程序中实体框架的连接恢复和命令拦截 这是微软官方SignalR 2.0教程Getting Started with Entity Framework 6 Code First using MVC ...