NSDiacriticInsensitiveSearch и арабский поиск

Как известно, NSDiacriticInsensitiveSearch не оказывает такого же эффекта на арабские буквы, как на французском. Вот почему я пытаюсь создать тот же эффект, но с арабскими буквами.
Например, если пользователь вводит букву "ا" , в строке поиска должны отображаться все слова, содержащие букву "ا" и букву: "أ" в то же время.
Использование следующей строки:

  text = [text stringByReplacingOccurrencesOfString:@"ا" withString:@"أ"];

не покажет результаты слов, начинающихся с "ا" .
В строке поиска я попытался реализовать тот же метод NSDiacriticInsensitiveSearch, что и во французском, и это не сработало:

NSRange nameRange = [author.name rangeOfString:text options:NSAnchoredSearch | NSDiacriticInsensitiveSearch];

Любые идеи, как это сделать?

Ответ 1

Вы можете использовать регулярное выражение для обработки арабских (Alif) разных фигур.

Предположим, что у вас есть контекст, который "محمد بن إبراهيم الابراهيمي" , и шаблон для поиска - "إبراهيم" , тогда вы можете преобразовать шаблон к регулярному выражению, которое обрабатывает дифференцирование между "أ". Регулярное выражение должно быть "(أ | إ | ا) بر (أ | إ | ا) هيم" . Это будет искать шаблон по всем возможным формам.

Вот простой код, который я написал:

#import <Foundation/Foundation.h>

NSString * arabify(NSString * string)
{
    NSRegularExpression * alifRegex = [NSRegularExpression regularExpressionWithPattern:@"(أ|ا|إ)" options:0 error:nil];
    return [alifRegex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"(أ|ا|إ)"];
}

int main(int argc, const char * argv[])
{

    @autoreleasepool {

        NSString * context = @"محمد بن إبراهيم الابراهيمي";
        NSString * pattern = @"إبراهيم";

        // Get the regex for the Arabic word.
        NSString * regex = arabify(pattern);

        NSLog(@"context = %@", context);
        NSLog(@"pattern = %@", pattern);
        NSLog(@"regex = %@", regex);

        NSRange range = [context rangeOfString:regex options:NSRegularExpressionSearch];

        if (range.location == NSNotFound)
        {
            NSLog(@"Not found.");
        }
        else
        {
            NSLog(@"Found.");
            NSLog(@"location = %lu, length = %lu", (unsigned long)range.location, (unsigned long)range.length);
        }
    }

    return 0;
}

Брат удачи.

Ответ 2

Кажется, что вы используете составной символ (U + 0623), который не сопоставляется с другими представлениями Alif.

Вы рассматривали другие методы кодирования для Alif? Вы можете использовать разложенный вариант, который затем будет сопоставляться с "простым" Alif (U + 0627), как вы планируете:

ARABIC LETTER ALEF (U+0627) ARABIC HAMZA ABOVE (U+0654)

Смотрите здесь: http://www.fileformat.info/info/unicode/char/0623/index.htm