沒有標準化字符串的後果(IOS)

對於NSString確定會常常用到,談談最近在項目中遇到的一個奇特的現象。以下:
咱們知道文件系統的命名都是用的字符串,好比你給文件取名「a.pdf」,而後保存文件後,那個文件的名字就真的是 "a.pdf"嗎?數組

假若有一個文件夾 folderName,他裏面包含一個文件 fileName.........而後咱們獲得一個包含許多文件名的數組函數

    NSFileManager* fileManager = [NSFileManagerdefaultManager];this

    NSError* error;spa

    NSArray* fileList = [fileManager contentsOfDirectoryAtPath:folderName error:&error];debug

 此時你設計

       if(![fileList containsObject: fileName]) {code

   NSLog(@"error!");orm

        }對象

那這個error必定不會出現嗎?? 不必定吧!!!!ci

最近在項目中咱們就遇到了這樣的事情, 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!");

            }

 }

 

........

相關文章
相關標籤/搜索