web-dev-qa-db-fra.com

Java. Ignorer les accents lors de la comparaison de chaînes

Le problème est simple. Existe-t-il une fonction dans Java pour comparer deux chaînes et retourner true en ignorant les caractères accentués?

c'est à dire

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

retour qui sont égaux.

Merci

54
framara

Je pense que vous devriez utiliser la classe Collator . Il vous permet de définir une force et des paramètres régionaux et il comparera les caractères de manière appropriée.

Depuis l'API Java 1.6:

Vous pouvez définir la propriété de force d'un collateur pour déterminer le niveau de différence considéré comme significatif dans les comparaisons. Quatre points forts sont fournis: PRIMAIRE, SECONDAIRE, TERTIAIRE et IDENTIQUE. L'affectation exacte des forces aux fonctionnalités linguistiques dépend des paramètres régionaux. Par exemple, en tchèque, "e" et "f" sont considérés comme des différences primaires, tandis que "e" et "ě" sont des différences secondaires, "e" et "E" sont des différences tertiaires et "e" et "e" sont identiques .

Je pense que le point important ici (que les gens essaient de faire) est que "Joao" et "João" ne devraient jamais être considérés comme égaux, mais si vous faites un tri, vous ne voulez pas qu'ils soient comparés en fonction de leur ASCII value car alors vous auriez quelque chose comme Joao, John, João, ce qui n'est pas bon. L'utilisation de la classe collator gère définitivement cela correctement.

63
DaveJohnston

Vous ne l'avez pas entendu de moi (parce que je ne suis pas d'accord avec la prémisse de la question), mais vous pouvez utiliser Java.text.Normalizer, et normalisez avec NFD: ceci sépare l'accent de la lettre à laquelle il est attaché. Vous pouvez ensuite filtrer les caractères d'accentuation et comparer.

23

Ou utilisez stripAccents de la bibliothèque Apache StringUtils si vous souhaitez comparer/trier les accents ignorés:

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

Le collateur renvoie 0 pour a et á, si vous le configurez pour ignorer les signes diacritiques:

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

isSame ("a", "á") renvoie true

6
Benny Bottema
public boolean insenstiveStringComparator (String a, String b) {
    Java.text.Collator collate = Java.text.Collator.getInstance();
    collate.setStrength(Java.text.Collator.PRIMARY);
    collate.setDecomposition(Java.text.Collator.CANONICAL_DECOMPOSITION); 
    return collate.equals(a, b);    
}