Как игнорировать символ Юникода во время поиска?

Я пытаюсь выполнить поиск своего приложения. Если вы пишете точное слово в строке поиска, это нормально, но, например, если я хочу найти «книгу», и я набираю «böök» diacritics, это не имеет значения. Я использовал код ниже, но он не полезен и также не работает при поиске, например, «Нью-Йорк – Бьорк». Я также пробовал разные комбинации 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]; } } 

Если вы используете базовые данные, вы можете использовать NSPredicate, который ищет в случае и диакритическую нечувствительность. Ответы в этом вопросе выполняются без учета регистра, если вы добавите [cd] качестве части сравнения, например, contains[cd] или ==[cd] , тогда он выполнит случайный и диакритический бесчувственный поиск.

Фактически, вы могли бы сделать так:

NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "Имена CONTAINS [cd]% @", searchText];

searchArray = [[listOfItems filterArrayUsingPredicate: предикат] mutableCopy];

Поскольку NSPredicate может игнорировать unicode, тогда searchArray – это то, что вы хотите.

Вы пытались просто взять ваш существующий код и заменить все экземпляры

 NSCaseInsensitiveSearch 

с

 NSCaseInsensitiveSearch|NSDiacriticInsensitiveSearch|NSWidthInsensitiveSearch 

? Похоже, что это решит вашу проблему самым прямым образом.

Если вы хотите, чтобы böök соответствовал book но не наоборот, тогда посмотрите на этот ответ , чтобы böök диакритические метки от böök прежде чем искать его. Но это подвержено ошибкам и, вероятно, не то, что вы действительно хотите сделать в любом случае.