它在某种程度上不适用于斯堪的纳维亚字母。
当我输入@“å”时,有两个“三明治”搜索词的字符串; 一个字符串以“ø”开头,低于“å”,另一个字符串以“å”开头。然而,这个比较代码返回SOMETIMES正确,有时错误的结果,即使我使用相同的搜索字符串,即@“å”一遍又一遍。有没有我忽略的东西?
编辑:抱歉它应该是两个不同的compStrings(在我的代码中),我忘了把数字2作为后缀。compString2表示以å开头的第二个字符串。 compString是以ø开头的那个。
我需要将搜索字符串与两个字符串进行比较,以确定它是否在这两个字符串之间。
让我以更好的方式表达它,对于那些不懂斯堪的纳维亚字母的人来说,å就像c和ø就像b,如果搜索字符串是c,那么它必须在b和c之间,对吗?
这是我的代码:
NSString *compString = [array objectAtIndex:i]; //i is an incremental number from a for-loop
//norwegian language
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"no_NO"];
if([searchString compare:compString2
options:(NSCaseInsensitiveSearch | NSAnchoredSearch)
range:range
locale:locale] == (NSOrderedAscending | NSOrderedSame)) {
if([searchString compare:compString
options:(NSCaseInsensitiveSearch | NSAnchoredSearch)
range:range
locale:locale] == NSOrderedDescending) {
NSLog(@"found");
}
}
FINAL-编辑:
我发现了问题。解决方案很简单。永远不要做我按位写的OR运算符“|”或普通OR运算符“||”。
if([searchString compare:compString
options: NSCaseInsensitiveSearch
range:range locale:locale] == NSOrderedAscending ||
[searchString
compare:compString
options: NSCaseInsensitiveSearch
range:range locale:locale] == NSOrderedSame)
表示 searchString< = compString
if([searchString
compare:compString
options: NSCaseInsensitiveSearch
range:range locale:locale] == NSOrderedDescending)
意思是 searchString> compString
答案 0 :(得分:1)
我认为你不应该在第一次比较结果评估中使用NSOrderedAscending
和NSOrderedSame
作为位字段的位,因为你没有得到你的逻辑(!)OR
可能想要。
请在您的第一个if ()
:
if([searchString compare:compString2
options:(NSCaseInsensitiveSearch | NSAnchoredSearch)
range:range
locale:locale] != NSOrderedDescending) {
/* ... */
}