我需要确定给定的NSString是否为NFD形式。我该怎么做?
背景:
我从Mac OS获得的文件路径(以NSString的形式)是规范的分解形式(NFD)。当文件系统是HFSPlus时尤其如此。 http://developer.apple.com/mac/library/technotes/tn/tn1150.html#CanonicalDecomposition
我需要一个预先组合的字符串。现在,我只想知道文件名以NFD格式分解时才运行precomposedStringWithCanonicalMapping
函数。
我能想到的解决方案:
//works on the idea that NFD(NFD(x)) = NFD(x)
BOOL IsCanonicallyDecompsed(NSString *initialFilePath) {
//decompose the string to NFD form
NSString *nfdFormOfStr = [initialFilePath decomposedStringWithCanonicalMapping];
char *ndfFormUTF8 = [nfdFormOfStr UTF8String];
char *intialPathUTF8 = [initialFilePath UTF8String];
return (strcmp(ndfFormUTF8, intialPathUTF8) == 0);
}
我的解决方案好吗?另外,我对文件系统输出(在NFD中)的理解是否正确?
答案 0 :(得分:3)
如果您需要预先组合的字符串(NFC),最简单和最安全的做法是始终运行precomposedStringWithCanonicalMapping
,无论字符串是否为NFD。例如,你可能会得到一个字符串,其中某些字符是预先组合的,有些是分解的。
请注意,HFS +文件系统使用NFD的修改版本,其中保留了一些代码点范围,以便与Mac OS 9兼容;我不知道decomposedStringWithCanonicalMapping
函数是否使用与HFS +相同的规则。