核心基础字符串对象包含一系列的字符串搜索,对比两个字符串的函数。因为这些操作是语义相关的,每个操作的主要的函数并不奇怪。CFStringFindWithOptions和CFStringCompareWithOptions-有相同的参数。开始的四个参数几乎相同;两个CFString对象的引用(比较的两个字符串或者在主要字符串中查找的子串),包含在操作中得一个字符范围,和一个指定选项的位掩码。如果你对字符串排序表现给用户,你应当使用CFStringCompareWithOptionsAndLocale和用户的本地做本地化比较。
比较和搜索字符串
尽管CFStringFindWithOptions和CFStringCompareaWithOptions有相同的特点,它们也有重要的不同。CFStringCompareWithOptions函数返回一个Comparison Results类型的结果;这个枚举常量表明是否比较的两个字符串相等或者第一个指定字符串大于或者小于第二个字符串。CFStringFindWithOptions函数,换句话说,返回一个Boolean结果,表明这个操作是否成功。此函数通过最后一个参数间接返回的更有用的结果是一个范围指针(一个CFRange结构类型);这个方位包括找到的字符串在主要字符串中得位置。
列表1 阐述了如何使用CFStringCompareWithOption和CFStringFindWithOption
在这个例子中,查找和比较函数都指定了kCFCompareCaseInsensitive标志作为操作选项,导致在这种情况下它忽略不同之处。其他可用的选项标志,包括kCFCompareBackwards(从字符串的末尾开始操作),kCFCompareNumerically(比较类似的字符串包含数字字符串数值),和kCFCompareLocalized(使用用户默认位置进行此操作)
列表1 比较和查找字符串内容
void compareAndSearchStringExample()
{
CFStringRef str1 = CFSTR("ABCDEFG");
CFStringRef str2 = CFSTR("abcdefg");
CFStringRef str3 = CFSTR("Kindergarten is the time to start teaching the ABCDEFG's");
CFRange foundRange;
CFComparisonResult result;
result = CFStringCompareWithOptions(str1, str2, CFRangeMake(0,CFStringGetLength(str1)), kCFCompareCaseInsensitive);
if (result == kCFCompareEqualTo) {
show(CFSTR("%@ is the same as %@"), str1, str2);
}else{
show(CFSTR("%@ is not the same as %@"), str1, str2);
}
if (CFStringFindWithOptions(str3, str1, CFRangeMake(0, CFStringGetLength(str3)), kCFCompareCaseInsensitive, &foundRange)) {
show(CFSTR("The string \"%@\" was fount at index %d in string \"%@\"."),str1,foundRange.location,str3);
}else{
show(CFSTR("The string \"%@\" was not fount in string \"%@\"."),str1,str3);
}
}
默认的,基本CFString对象比较是逐个字符进行比较。在一些情况中可能没有给你想要的结果,自从一些字符可以被多种不同的方式呈现(举个例子,“ö”可以被两种有区别的字符(“o”和“umlaut”)或者用一个字符(“o-umlaut”))如果你允许宽松的等效,使用搜索或者比较函数时定义kCFCompareNonliteral选项。注意,如果你不指定一个non-literal比较,查找函数返回的长度位置可能跟查找字符串的长度不一致。
除了主要的比较和查找函数,字符串对象提供一些方便的函数。CFStringFind和CFStringCompare跟主要的比较和查找字符串函数比较相似,但是他们不需要指定范围参数(默认指定整个字符串)。你可以使用CFStringCompare在CoreFoundation的任何地方当一个函数指针要求遵循CFComparatorFunction类型。
另一些字符串对象搜索和比较函数是CFStringHasPrefix,CFStringHasSuffix,CFStringCreateArrayWithFindResults。最后一个函数当你希望搜索结果是多个时是有用的;它返回一个CFRange结构数组,每一个指定搜索结果在主字符串的位置。
字符串排序
如果你对字符串排序并且将结果呈现在用户面前,你需要确认你使用用户的位置执行了一个本地的比较。你可能想排序字符串跟Finder中出现的一样,举个例子,这些字符串{“string 12”,"string 1","string 22","string 02"}排序后:{"string 1","string 02","string 12","string 22"}
为了达到这个母的,你可以使用CFStringCompareWithOptionsAndLocale,附加选项:kCFCompareCaseInsensitive,kCFCompareNonliteral,kCFCompareLocalized,kCFCompareNumerically,kCFCompareWidthInsensitive和kCFCompareForcedOrdering。第一步,实现一个函数来执行适当的比较:
CFComparisonResult compareStringLikeFinderWithLocal(const void* string1 ,const void* string2,void* locale)
{
static CFOptionFlags compareOptions = kCFCompareCaseInsensitive|
kCFCompareNonliteral|kCFCompareLocalized|kCFCompareNumerically|kCFCompareWidthInsensitive|kCFCompareForcedOrdering;
CFRange string1Range = CFRangeMake(0, CFStringGetLength(string1));
return CFStringCompareWithOptionsAndLocale(string1, string2, string1Range, compareOptions, locale);
}
然后用下面的函数实施这个比较
CFMutableArrayRef theArray = CFArrayCreateMutable(kCFAllocatorDefault, 4, NULL);
CFArrayAppendValue(theArray, CFSTR("String12"));
CFArrayAppendValue(theArray, CFSTR("String1"));
CFArrayAppendValue(theArray, CFSTR("String22"));
CFArrayAppendValue(theArray, CFSTR("String02"));
CFRange arrayRange = CFRangeMake(0, CFArrayGetCount(theArray));
CFLocaleRef locale = CFLocaleCopyCurrent();
CFArraySortValues(theArray, arrayRange, compareStringLikeFinderWithLocal, (void*)locale);