NSDiacriticInsensitiveSearch和阿拉伯语搜索

Eli*_*hme 12 sqlite arabic uisearchbar ios7

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

  text = [text stringByReplacingOccurrencesOfString:@"?" withString:@"?"];
Run Code Online (Sandbox Code Playgroud)

不会显示以"ا"开头的单词的结果.
在搜索栏中,我尝试实现与我在法国案例中所做的相同的NSDiacriticInsensitiveSearch方法,但它没有成功:

NSRange nameRange = [author.name rangeOfString:text options:NSAnchoredSearch | NSDiacriticInsensitiveSearch];
Run Code Online (Sandbox Code Playgroud)

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

小智 0

您可以使用正则表达式来处理阿拉伯语(Alif)的不同形状。

\n\n

假设您有一个上下文,即"\xd9\x85\xd8\xad\xd9\x85\xd8\xaf \xd8\xa8\xd9\x86 \xd8\xa5\xd8\xa8\xd8\xb1\xd8\xa7 \xd9\x87\xd9\x8a\xd9\x85 \xd8\xa7\xd9\x84\xd8\xa7\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x87\xd9\x8a\xd9\x85\xd9 \x8a",要搜索的模式是"\xd8\xa5\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x87\xd9\x8a\xd9\x85",那么你可以将该模式转换为处理“\xd8\xa3”之间差异的正则表达式。正则表达式应为“(\xd8\xa3|\xd8\xa5|\xd8\xa7)\xd8\xa8\xd8\xb1(\xd8\xa3|\xd8\xa5|\xd8\xa7)\xd9\x87 \xd9\x8a\xd9\x85"。这将通过所有可能的形状来搜索模式。

\n\n

这是我写的一个简单的代码:

\n\n
#import <Foundation/Foundation.h>\n\nNSString * arabify(NSString * string)\n{\n    NSRegularExpression * alifRegex = [NSRegularExpression regularExpressionWithPattern:@"(\xd8\xa3|\xd8\xa7|\xd8\xa5)" options:0 error:nil];\n    return [alifRegex stringByReplacingMatchesInString:string options:0 range:NSMakeRange(0, [string length]) withTemplate:@"(\xd8\xa3|\xd8\xa7|\xd8\xa5)"];\n}\n\nint main(int argc, const char * argv[])\n{\n\n    @autoreleasepool {\n\n        NSString * context = @"\xd9\x85\xd8\xad\xd9\x85\xd8\xaf \xd8\xa8\xd9\x86 \xd8\xa5\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x87\xd9\x8a\xd9\x85 \xd8\xa7\xd9\x84\xd8\xa7\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x87\xd9\x8a\xd9\x85\xd9\x8a";\n        NSString * pattern = @"\xd8\xa5\xd8\xa8\xd8\xb1\xd8\xa7\xd9\x87\xd9\x8a\xd9\x85";\n\n        // Get the regex for the Arabic word.\n        NSString * regex = arabify(pattern);\n\n        NSLog(@"context = %@", context);\n        NSLog(@"pattern = %@", pattern);\n        NSLog(@"regex = %@", regex);\n\n        NSRange range = [context rangeOfString:regex options:NSRegularExpressionSearch];\n\n        if (range.location == NSNotFound)\n        {\n            NSLog(@"Not found.");\n        }\n        else\n        {\n            NSLog(@"Found.");\n            NSLog(@"location = %lu, length = %lu", (unsigned long)range.location, (unsigned long)range.length);\n        }\n    }\n\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

祝兄弟好运。

\n