对于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. enq: SQ - contention

    --每分钟操作 SQL> select  sql_id, mi, count(mi)   2    from (select event, sql_id, to_char(sample_time ...

  2. 基于Jquery的多彩二维码的生成

    Demo效果图: 源代码: @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name=&quo ...

  3. CSharp设计模式读书笔记(6):建造者模式(学习难度:★★★★☆,使用频率:★★☆☆☆)

    建造者模式(Builder Pattern):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 模式角色与模式: 建造者模式可以将一个产品的内部表象与产品的生产过程分割开来, ...

  4. [VirtualBox] - Install Oracle Linux 7 on Oracle VirtualBox

    I'll start coding with JEE soon. Product environment adopts Oracle + WebLogic in Linux, technology a ...

  5. 记录近期小改Apriori至MapReduce上的心得

    ·背景 前一阵,一直在研究一些ML的东东,后来工作关系暂停了一阵.现在继续把剩下一些热门的算法再吃吃透,"无聊+逗比"地把他们搞到MapReduce上.这次选择的入手对象为Apri ...

  6. Swift入门教程:基本语法(三)

    打印输出 Swift提供了2个打印输出函数 println :输出内容后会自动换行 print :对比println,少了个自动换行的功能 示例 输出字符串 println("欢迎学习传智播 ...

  7. PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4

    原文:PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4 本文介绍如何在Windows下配置php扩展. 本文链接 http://blog.csdn. ...

  8. 事半功倍之StyleCop(一)

    事半功倍之StyleCop(一) 前言 曾几何时,你是否在看别人代码的时候总是在抱怨代码没有注释,命名不规范,代码风格不统一,代码可读性差?是否有一个适合团队开发规范的检查工具? 答案就是大名鼎鼎的S ...

  9. MySQL中group_concat函数-和group by配合使用

    MySQL中group_concat函数 完整的语法如下: group_concat([DISTINCT] 要连接的字段 [Order BY ASC/DESC 排序字段] [Separator '分隔 ...

  10. location将地址栏参数拆分成键值对的对象

    window.location可获取地址栏的一系列信息,并且每个浏览器都支持该属性,非常方便.而获取到的问号后面的参数可以进行加工转变成我们所想要的键值对. location的属性: 属性名 例子 说 ...