對於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!");
}
}
........