2010-01-21 9 views
6

Nel mio attuale implementazione di un UISearchBarController sto usando [NSString compare:] all'interno del metodo filterContentForSearchText:scope: delegato per restituire gli oggetti rilevanti in base alla loro proprietà nome ai risultati UITableView come si inizia a digitare.Cerca o confrontare all'interno di un cluster Grapheme in coreano

Finora questo funziona perfettamente in inglese e coreano, ma quello che mi piacerebbe essere in grado di fare è cercare all'interno dei cluster di caratteri definiti da NSString. Questo è applicabile solo per una manciata di lingue, di cui il coreano è uno.

In inglese, compare: restituisce nuovi risultati dopo ogni lettera inserita, ma in coreano i risultati vengono generati una volta completato un cluster grafema riconosciuto. Mi piacerebbe essere in grado di cercare attraverso la mia proprietà nome oggetti coreani tramite i singoli elementi che compongono una sillaba.

Qualcuno può far luce su come affrontare questo? Sono sicuro che abbia qualcosa a che fare con la ricerca attraverso caratteri UTF16 manualmente o utilizzando una classe di livello inferiore.

Cheers!

Ecco un esempio specifico che non è solo lavorando:

`NSString *string1 = @"이"; 
`NSString *string2 = @"ㅣ"; 
NSRange resultRange = [[string1 decomposedStringWithCanonicalMapping] rangeOfString: [string2 decomposedStringWithCanonicalMapping] options:(NSLiteralSearch)]; 

Il risultato è sempre NSNotFound, con o senza decomposedStringWithCanonicalMapping.

Qualche idea?

risposta

2

Non sono un esperto, ma penso che tu sia molto improbabile trovare una soluzione pulita per quello che volete. Non sembra esserci alcuna relazione tra il valore Unicode di un personaggio coreano e i grafemi di cui è composto.

ad es. "이" è \ uc774 e "ㅣ" è \ u3163. Dal punto di vista di NSString, sono solo due personaggi diversi senza una relazione specifica l'uno con l'altro.

Sospetto che sarà necessario trovare o creare una mappatura esplicita tra i caratteri e i loro grafemi e quindi scrivere la propria funzione di ricerca che consulta questa mappatura.

This very long page on Unicode Korean può aiutare, se si tratta di questo. Ha una tabella di tutti i personaggi che suggerisce una relazione strutturata tra il modo in cui i caratteri sono numerati e le loro componenti.

+0

Lawrence, quell'informazione è fantastica. Ci sono app per iPhone in coreano che sembrano fare ciò che sto tentando; ma suppongo di essere sotto ipotesi errata su come il coreano sia memorizzato in UTF8/16. Grazie per la risposta, ha sicuramente chiarito la mia domanda. – Jessedc

+0

Grazie per il vostro aiuto Lawrence, ho accettato la tua risposta; è stato un grande passo nella giusta direzione. – Jessedc

1

Se si utilizza compare:options con NSLiteralString, è necessario confrontare carattere per carattere, ovvero i punti di codice Unicode, indipendentemente dal grapheme. Il comportamento predefinito di compare: è di non utilizzare opzioni. Si potrebbe utilizzare - decomposedStringWithCanonicalMapping per ottenere i byte Unicode della stringa di input, ma non sono sicuro di come sarebbe interagire con compare:.

+0

Grazie per aver dedicato del tempo per rispondere Don. Mi hai fatto giocare oggi per una buona ora. Ho aggiunto un esempio specifico alla domanda su cosa sto tentando di fare. – Jessedc