对于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. 使用Visual Studio创建映像向导(Image Sprite)——Web Essential

    原版的:Creating Image Sprite in Visual Studio - Web Essential 译者注:有关图片精灵的信息请參阅http://baike.baidu.com/vi ...

  2. .NET 各种问题汇总

    1.i++ 与++i的区别 using System; class TestApp { public static void Main() { int i = 8; int count = ++i;/ ...

  3. ArcEngine载入中SDE问题栅格数据

    当直接加载矢量数据到IFeatureWorkspace接口可,但是,在装载门格当要传送的数据IRasterWorkspaceEx接口. 效果如下面的,对可以被添加到双击Globe在. watermar ...

  4. Linux---江湖

    Linux江湖13:我该如何备份系统 Posted on 2014-12-18 10:39 京山游侠 阅读(497) 评论(3) 编辑 收藏 在前面的一些文章中,我反复提到经常会把系统搞崩溃,所以备份 ...

  5. Chapter 1 Securing Your Server and Network(1):选择SQL Server业务经理

    原版的:http://blog.csdn.net/dba_huangzj/article/details/37924127  ,专题文件夹:http://blog.csdn.net/dba_huang ...

  6. ACM-简单的主题Factorial——poj1401

    明出处:http://blog.csdn.net/lttree Factorial Time Limit: 1500MS   Memory Limit: 65536K Total Submission ...

  7. Ubuntu12.10无法安装openssh-server[已解决]

    因为要在Ubuntu下搞些东西,家里的台式有Deepin2013,但是发现有很多依赖的问题,实在不想解决,就到win7下用VBox安装了Ubuntu.打算使用SourceCRT连接虚拟机,但是在安装在 ...

  8. Spring IOC 之个性化定制the nature of a bean

    1.生命周期回调 为了影响容器管理的bean的生命周期,你可以实现Spring的InitializingBean和DisposableBean接口.容器首先调用afterPropertiesSet() ...

  9. JSON解析之Gson

    1.Gson简介 Gson是一个将Java对象转为JSON表示的开源类库,由Google提供,并且也可以讲JSON字符串转为对应的Java对象.虽然有一些其他的开源项目也支持将Java对象转为JSON ...

  10. 一个web开发框架

    一个web开发框架 怎么才能成为一名架构师?需要具备哪些条件? 作为一名码农我迫切希望自己成为一个比较合格的web架构师,昨晚心血来潮小弟花了4个小时的时间整了个简易的web开发框架,由于第一次搭建框 ...