2010-03-03 16 views
48

Il problema è facile. C'è qualche funzione in JAVA per confrontare due stringhe e restituire true ignorando i caratteri accentati?Java. Ignora gli accenti quando confronti stringhe

cioè

String x = "Joao"; 
String y = "João"; 

ritorno che sono uguali.

Grazie

+7

ma questi sono __NOT__ uguali, perché si vuole loro di essere uguali quando non lo sono? –

+6

@fuzzy entrambi hanno solitamente lo stesso nome (è la versione portoghese di John).Alcune persone sono semplicemente pigre per includere gli accenti –

+1

In spagnolo, n e ñ sono considerate lettere diverse. –

risposta

60

Penso che dovresti usare la classe Collator. Ti permette di impostare una forza e un locale e confronterà i personaggi in modo appropriato.

Dal Java 1.6 API:

È possibile impostare un Collator proprietà forza per determinare il livello di differenza considerata significativa in confronti. Quattro punti di forza sono forniti: PRIMARIO, SECONDARIO, TERZIARIO e IDENTICO. L'esatta assegnazione di alle funzioni di linguaggio dipende dalle impostazioni internazionali. Ad esempio, in ceco, "e" e "f" sono considerati differenze principali, mentre "e" e "E" sono differenze secondarie, "e" e "E" sono differenze terziari e "e" e "e" sono identici.

Credo che il punto importante qui (che le persone stanno cercando di fare) è che "Joao" e "João" non dovrebbero mai essere considerati come uguali, ma se si sta facendo l'ordinamento non si vuole che siano confrontato in base al loro valore ASCII perché poi avresti qualcosa come Joao, John, João, che non è buono. L'utilizzo della classe collator lo gestisce sicuramente correttamente.

+1

Questa è una risposta migliore di quella accettata. –

+3

@Software Monkey: anch'io sono d'accordo, anche se ho scritto la risposta accettata. :-P –

+1

FYI gente, ha creato un po 'di codice [qui] (https://code.google.com/p/jjcommon/source/browse/trunk/src/main/java/com/jjcommon/JJStringUtils.java? spec = svn11 & r = 11 # 82) che segue le tue linee guida, quindi grazie per questo. Comunque non ho visto un modo per fare un confronto che sia ACCENT insensibile, ma CASE sensibile, seguendo le regole di Collator ... mi sono perso qualcosa? –

-1

Il problema di questo genere di conversioni è che non c'è sempre una mappatura chiara da accentati a caratteri non accentati. Dipende da codepage, localizzazioni, ecc. Ad esempio, si tratta di un accento equivalente a un "a"? Non è un problema per un umano, ma più complicato per il computer.

AFAIK Java non ha una conversione incorporata che può cercare le opzioni di localizzazione correnti e realizzare questo tipo di conversioni. Potrebbe essere necessario un po 'di libreria esterna che gestisce unicode meglio, come ICU (http://site.icu-project.org/)

+0

Java ce l'ha, si chiama [Collater] (http://docs.oracle.com/javase/tutorial/i18n/text/locale.html) ed è specificamente progettato per questo tipo di problema. –

23

Non hai sentito questo da me (perché non sono d'accordo con la premessa della questione), ma, è possibile utilizzare java.text.Normalizer, e normalizzare con NFD: questo separa l'accento dalla lettera a cui è collegato. È quindi possibile filtrare i caratteri accentati e confrontare.

+0

Grazie, questo è proprio quello di cui avevo bisogno. – framara

+4

I due passaggi sono combinati in uno da StringUtils.stripAccents http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringUtils.html – cquezel

+1

Questo è molto valido soprattutto nei sistemi che devono confrontare i dati internazionali. 1- Probabilmente pochissimi sistemi al mondo gestiscono correttamente qualsiasi cosa multilingue. Caso in questione è menzionato nei thread sottostanti che anche java ha un buggato supporto Unicode. 2- Quando si dispone di servizi che accettano dati da terze parti, tutto va a ruba. Dal momento che nessuno gestisce mai i dati in modo coerente. 2- Come accennato prima, le persone semplicemente non inseriscono i dati correttamente. O perché pigro, errori di battitura, ecc ... 3- Joao potrebbe anche essere un utente spagnolo che usa purtroppo un computer inglese. – user432024

4

Collator restituisce 0 per A e A, se si configura per ignorare i segni diacritici:

public boolean isSame(String a, String b) { 
    Collator insenstiveStringComparator = Collator.getInstance(); 
    insenstiveStringComparator.setStrength(Collator.PRIMARY); 
    return insenstiveStringComparator.compare(a, b) == 0; 
} 

isSame ("a", "a") produce vera

2

Oppure utilizzare stripAccents dalla libreria apache StringUtils se si desidera confrontare/sorta ignorando gli accenti:

public int compareStripAccent(String a, String b) { 
    return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b)); 
} 
Problemi correlati