NSDiacriticInsensitiveSearch和阿拉伯语搜索

时间:2014-04-11 13:12:20

标签: ios7 sqlite uisearchbar arabic

众所周知,NSDiacriticInsensitiveSearch对阿拉伯字母的影响与对法语的影响不同。这就是为什么我试图用阿拉伯字母创建相同的效果。
例如,如果用户输入字母“ا”,搜索栏应显示包含字母“ا”和字母的所有单词:“أ”同时。
使用以下行:

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

不会显示以“ا”开头的单词的结果。
在搜索栏中,我试图像我在法国案例中那样实现相同的NSDiacriticInsensitiveSearch方法,但它没有成功:

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

有任何想法如何完成这项工作?

2 个答案:

答案 0 :(得分:0)

您可以使用正则表达式处理阿拉伯语(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;
}
祝你好运兄弟。

答案 1 :(得分:0)

您似乎正在使用复合符号(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