如何确定NSD是否在NFD中正常化?

时间:2010-09-07 06:52:09

标签: objective-c unicode nsstring normalization unicode-normalization

我需要确定给定的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中)的理解是否正确?

1 个答案:

答案 0 :(得分:3)

如果您需要预先组合的字符串(NFC),最简单和最安全的做法是始终运行precomposedStringWithCanonicalMapping,无论字符串是否为NFD。例如,你可能会得到一个字符串,其中某些字符是预先组合的,有些是分解的。

请注意,HFS +文件系统使用NFD的修改版本,其中保留了一些代码点范围,以便与Mac OS 9兼容;我不知道decomposedStringWithCanonicalMapping函数是否使用与HFS +相同的规则。