2014-12-09 7 views
15

Per un programma Java che sto scrivendo, ho un particolare bisogno di ordinare le stringhe lessicograficamente per codice Unicode. Questo è non lo stesso di String.compareTo() quando si inizia a trattare con valori esterni al Piano multilingue di base. String.compareTo() confronta le stringhe lessicograficamente su valori char a 16 bit. Per vedere che questo non è equivalente, si noti che U + FD00 HAIR LIGATURE HAH WITH YEH ISOLATED FORM è inferiore a U + 1D11E MUSICAL SYMBOL G CLEF, ma l'oggetto Java String"\uFD00" per il carattere arabo è maggiore della coppia sostitutiva "\uD834\uDD1E" per chiave.Qual è il modo preferito per confrontare due stringhe Java lessicograficamente su * punti codice Unicode *?

Posso eseguire il loop manualmente lungo i punti codice using String.codePointAt() and Character.charCount() e, se necessario, effettuare il confronto. Esiste una funzione API o altro modo "canonico" per farlo?

+0

Hai sicuramente bisogno di essere lessicografico, senza alcun riguardo per la normalizzazione, le impostazioni internazionali, ecc.? –

+0

@JonSkeet Il vero problema che sto cercando di risolvere è che ho un caso bizzarro in un formato di file che sto progettando dove ho bisogno di un ordinamento String che 1) funzioni per qualsiasi carattere Unicode, 2) sia indipendente dalla locale, e 3) è facile da specificare in modo che altri programmi possano replicarlo. L'ordinamento effettivo è in qualche modo meno rilevante. Ho scelto l'ordine in codice Unicode perché sembrava il più semplice da specificare in considerazione dei vincoli di cui sopra. Per inciso, le stringhe di input saranno di fatto normalizzate a NFC a causa di altre regole nelle specifiche. –

+0

In quali lingue sono probabilmente scritti gli altri programmi? Se sono quelli in cui UTF-16 è la norma (ad esempio qualsiasi cosa in .NET), si potrebbe facilmente dire che si stanno confrontando le unità di codice UTF-16 in modo lessicale ... –

risposta

Problemi correlati