众所周知,NSDiacriticInsensitiveSearch对阿拉伯字母的影响与对法语的影响不同。这就是为什么我试图用阿拉伯字母创建相同的效果。
例如,如果用户输入字母“ا”,搜索栏应显示包含字母“ا”和字母的所有单词:“أ”同时。
使用以下行:
text = [text stringByReplacingOccurrencesOfString:@"ا" withString:@"أ"];
不会显示以“ا”开头的单词的结果。
在搜索栏中,我试图像我在法国案例中那样实现相同的NSDiacriticInsensitiveSearch方法,但它没有成功:
NSRange nameRange = [author.name rangeOfString:text options:NSAnchoredSearch | NSDiacriticInsensitiveSearch];
有任何想法如何完成这项工作?
答案 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