2014-04-11 16 views
11

Wie bekannt, die NSDiacriticInsensitiveSearch nicht den gleichen Effekt auf arabische Buchstaben wie es auf Französisch tut. Deshalb versuche ich, den gleichen Effekt zu erzeugen, aber mit arabischen Buchstaben.
Zum Beispiel, wenn ein Benutzer den Buchstaben "Ç" eingibt, sollte die Suchleiste alle Wörter anzeigen, die den Buchstaben "Ç" und den Buchstaben "أ" gleichzeitig enthalten.
Die Verwendung der folgenden Zeile:
NSDiacriticInsensitiveSearch und arabische Suche

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

nicht die Ergebnisse der Worte zeigen mit „ا“ ab.
in der Suchleiste, habe ich versucht, die gleichen NSDiacriticInsensitiveSearch Verfahren zu implementieren, wie ich in dem französisch Fall getan habe, und es hat aus nicht:

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

Irgendwelche Ideen, wie dies zu tun bekommen?

Antwort

0

Sie können den regulären Ausdruck verwenden, um die verschiedenen Formen zu behandeln.

Angenommen, Sie einen Kontext, das heißt „محمد بن إبراهيم الابراهيمي“ und das Muster zu suchen ist „إبراهيم“, dann könnte man das Muster zu einem regulären Ausdruck umwandeln, die die Differenzierung Griff zwischen das "أ". Der reguläre Ausdruck sollte "(أ | إ | Ç) بر (أ | إ | Ç) هيم" sein. Dies wird nach dem Muster durch seine alle möglichen Formen suchen.

Hier ist eine einfache Code, den ich schrieb:

#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; 
} 

Viel Glück Bruder.

0

Es scheint, dass Sie das zusammengesetzte Symbol (U + 0623) verwenden, das nicht mit anderen Darstellungen von Alif übereinstimmt.

Haben Sie andere Kodierungsmethoden für Alif in Betracht gezogen? Sie könnten die zerlegt Variante verwenden, die dann mit dem "plain" Alif (U + 0627) sammeln würde, wie Sie beabsichtigen:

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

Siehe hier: http://www.fileformat.info/info/unicode/char/0623/index.htm