2014-04-11 14 views
11

Come noto, NSDiacriticInsensitiveSearch non ha lo stesso effetto sulle lettere arabe come fa il francese. Ecco perché sto cercando di creare lo stesso effetto ma con lettere arabe.
Ad esempio, se un utente inserisce la lettera "E", la barra di ricerca dovrebbe mostrare tutte le parole contenenti la lettera "E" e la lettera: "أ" allo stesso tempo.
L'uso della seguente riga:
NSDiacriticInsensitiveRicerca e ricerca araba

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

non mostrerà i risultati delle parole che iniziano con "ا".
Nella barra di ricerca, ho cercato di implementare lo stesso metodo NSDiacriticInsensitiveSearch come ho fatto nel caso francese, e non ha funzionato:

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

Delle idee come ottenere questo fatto?

risposta

0

È possibile utilizzare l'espressione regolare per gestire l'arabo (Alif) forme diverse.

Supponiamo di avere un contesto, cioè "محمد بن إبراهيم الابراهيمي", e il modello per cercare è "إبراهيم", allora si potrebbe convertire il modello di un'espressione regolare che gestisce la differenziazione tra il "أ". L'espressione regolare dovrebbe essere "(أ | إ | ا) بر (أ | إ | ا) هيم". Questo cercherà il pattern in base a tutte le possibili forme.

Ecco un semplice codice che ho scritto:

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

Buon fratello fortuna.

0

Sembra che si stia utilizzando il simbolo composto (U + 0623), che non collima con altre rappresentazioni di Alif.

Hai considerato altri metodi di codifica per l'Alif? È possibile utilizzare la variante decomposto, che poi sarebbe raccogliere con l'Alif "plain" (U + 0627) proprio come si intende:

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

Vedi qui: http://www.fileformat.info/info/unicode/char/0623/index.htm

Problemi correlati