如何在搜索时忽略unicode字符?

时间:2012-07-14 09:35:26

标签: objective-c ios xcode string unicode

我正在尝试搜索我的应用。如果你在搜索栏中写了一个确切的单词,那就没关系,但是例如,如果我想找到“书”而我输入“böök”变音符应该无关紧要。我使用下面的代码,但它没有用,也在搜索时失败,例如“纽约 - Björk”。我也尝试了searchEditedText的不同组合,但代码变得恶心。我怎样才能做到这一点?

NSString *searchText = [searchBar.text capitalizedString];
NSString *searchEditedText=[searchBar.text capitalizedString];
NSMutableArray *searchArray = [[[NSMutableArray alloc] init] autorelease];
for (NSDictionary *dictionary in listOfItems) {
  NSArray *array = [dictionary objectForKey:@"Names"];
  [searchArray addObjectsFromArray:array];
}
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"u" withString:@"ü"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"c" withString:@"ç"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"U" withString:@"Ü"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"C" withString:@"Ç"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"o" withString:@"ö"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"O" withString:@"Ö"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"g" withString:@"ğ"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"G" withString:@"Ğ"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"s" withString:@"ş"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"S" withString:@"Ş"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"i" withString:@"ı"];
searchEditedText = [searchEditedText stringByReplacingOccurrencesOfString:@"İ" withString:@"I"];
for (NSString *sTemp in searchArray) {
  NSRange titleResultsRange = [sTemp rangeOfString:searchText options:NSCaseInsensitiveSearch];
  NSRange titleResultsRange2 = [sTemp rangeOfString:searchEditedText options:NSCaseInsensitiveSearch];
  if (titleResultsRange2.length > 0 || titleResultsRange.length > 0) {
    [copyListOfItems addObject:sTemp];
  }
}

3 个答案:

答案 0 :(得分:4)

如果您正在使用Core Data,则可以使用以案例和变音符号不敏感方式搜索的NSPredicate。如果您在比较过程中添加[cd],则this question中的答案会执行不区分大小写的搜索。 contains[cd]==[cd],然后它将执行案例和变音符号不敏感搜索。

答案 1 :(得分:2)

事实上,你可以这样做:

NSPredicate * predicate = [NSPredicate predicateWithFormat:@“Names CONTAINS [cd]%@”,searchText];

searchArray = [[listOfItems filteredArrayUsingPredicate:predicate] mutableCopy];

因为NSPredicate可以忽略unicode,所以searchArray就是你想要的。

答案 2 :(得分:1)

您是否尝试过使用现有代码并替换

的所有实例
NSCaseInsensitiveSearch

NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch|NSWidthInsensitiveSearch

?这似乎可以以最直接的方式解决您的问题。

如果您希望böök匹配book不匹配,请参阅this answer以了解消除{{1}的变音符号的方法在搜索之前。但这很容易出错,而且可能不是你真正想做的事情。