55 votes

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

Le problème est simple. Existe-t-il une fonction en JAVA permettant de comparer deux chaînes de caractères et de renvoyer un résultat vrai en ignorant les caractères accentués ?

c'est-à-dire

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

qui sont égaux.

Merci

9 votes

Mais ce sont PAS pourquoi voudriez-vous qu'ils soient égaux alors qu'ils ne le sont pas ?

6 votes

@fuzzy les deux sont généralement le même nom (c'est la version portugaise pour John). Certaines personnes sont simplement paresseuses pour inclure les accents.

1 votes

En espagnol, n et ñ sont considérés comme des lettres différentes.

67voto

DaveJohnston Points 5475

Je pense que vous devriez utiliser la classe Collator. Elle vous permet de définir une force et une locale et elle comparera les caractères de manière appropriée.

De l'API Java 1.6 :

Vous pouvez définir la propriété " strength " d'un collateur pour déterminer le niveau de de différence considéré comme significatif dans les comparaisons. Quatre forces sont disponibles : PRIMAIRE, SECONDAIRE, TERTIAIRE, et IDENTIQUE. L'attribution exacte l'affectation exacte des points forts aux dépend de la langue. Par exemple, 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 comprendre) 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 sur la base de leur valeur ASCII, car vous auriez alors quelque chose comme Joao, John, João, ce qui n'est pas bon. L'utilisation de la classe collator permet de gérer correctement ce problème.

3 votes

@Software Monkey : Je suis aussi d'accord, même si j'ai écrit la réponse acceptée :-P

1 votes

Pour votre information, j'ai créé un peu de code. ici qui suit vos directives, donc merci pour cela. Cependant, je n'ai pas vu de moyen de faire une comparaison insensible à l'ACCENT, mais sensible à la CASE, en suivant les règles du Collator... ai-je manqué quelque chose ?

1 votes

@Joao vous ne pourrez pas faire cela avec la classe Collator car la force est fixée au niveau minimum. Ainsi, pour obtenir la sensibilité à la casse, vous avez besoin de TERTIAIRE, mais pour l'insensibilité aux accents, vous ne voulez que PRIMAIRE. Ils ne fonctionneront donc pas ensemble. Vous feriez mieux d'utiliser la solution de Chris Jester-Youngs pour filtrer les caractères accentués et comparer les chaînes de caractères normalement.

26voto

Chris Jester-Young Points 102876

Ce n'est pas moi qui vous l'ai dit (parce que je ne suis pas d'accord avec les prémisses de la question), mais, vous pouvez utiliser java.text.Normalizer et normaliser avec NFD Cela sépare l'accent de la lettre à laquelle il est attaché. Vous pouvez ensuite filtrer les caractères accentués et les comparer.

0 votes

Merci, c'est exactement ce dont j'avais besoin.

6 votes

Les deux étapes sont combinées en une seule par StringUtils.stripAccents commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/

1 votes

Ceci est très valable, notamment dans les systèmes qui doivent comparer des données internationales. 1- Il est probable que très peu de systèmes dans le monde gèrent correctement le multilinguisme. Par exemple, il est mentionné dans les fils de discussion ci-dessous que même Java a un support bogué de l'Unicode. 2- Lorsque vous avez des services qui acceptent des données de tierces parties, tout s'écroule. Puisque personne ne traite jamais les données de manière cohérente. 2- Comme mentionné précédemment, les gens ne saisissent pas les données correctement. Soit par paresse, soit à cause de fautes de frappe, etc... 3- Joao pourrait aussi bien être un utilisateur espagnol utilisant malheureusement un ordinateur anglais.

9voto

Plantface Points 863

Java Collateur renvoie 0 pour "a" et "á", si vous le configurez pour ignorer les diacritiques :

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

isSame("a", "á") donne vrai

9voto

Daniel Points 290

Ou utilisez stripAccents de la bibliothèque apache StringUtils si vous voulez comparer/trier des accents ignorants :

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

5voto

Eyal Lupu Points 626

Pour cela, vous devez utiliser la classe Collator avec la force appropriée. J'ai déjà écrit une explication détaillée à ce sujet dans mon blog - vous pouvez la lire ici

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X