2010-11-29 3 views
6

Doublons possibles:
Java. Ignore accents when comparing strings
Java string searching ignoring accentscomparaison Java unicode

Salut à tous

je dois comparer les chaînes en java qui pourrait être comme 'Chloe' et Chloé '. J'ai besoin qu'ils soient égaux. Quelqu'un sait quelle est la meilleure pratique? Ou y a-t-il une bibliothèque tierce?

Roman

+2

En fait, ils ne sont pas égaux, à moins que le 2ème est le français du l'anglais (ce qui signifie que vous devrez le traduire et faire une comparaison). –

Répondre

3

Nous traduisons la chaîne « Chloé » à « Chloe » avec correspondances codées en dur entre des caractères spéciaux et leur caractère ASCII équivalent, avant la comparaison. Cela fonctionne assez bien mais est maladroit et probablement, il y a quelques caractères spéciaux que nous avons oubliés.

Notre solution ressemble à ceci:

public static String replaceAccents(String string) { 
    String result = null; 

    if (string != null) { 
    result = string; 

    result = result.replaceAll("[àáâãåä]", "a"); 
    result = result.replaceAll("[ç]", "c"); 
    result = result.replaceAll("[èéêë]", "e"); 
    result = result.replaceAll("[ìíîï]", "i"); 
    result = result.replaceAll("[ñ]", "n"); 
    result = result.replaceAll("[òóôõö]", "o"); 
    result = result.replaceAll("[ùúûü]", "u"); 
    result = result.replaceAll("[ÿý]", "y"); 

    result = result.replaceAll("[ÀÁÂÃÅÄ]", "A"); 
    result = result.replaceAll("[Ç]", "C"); 
    result = result.replaceAll("[ÈÉÊË]", "E"); 
    result = result.replaceAll("[ÌÍÎÏ]", "I"); 
    result = result.replaceAll("[Ñ]", "N"); 
    result = result.replaceAll("[ÒÓÔÕÖ]", "O"); 
    result = result.replaceAll("[ÙÚÛÜ]", "U"); 
    result = result.replaceAll("[Ý]", "Y"); 
    } 

    return result; 
} 

Je suis curieux de savoir une bonne réponse à cette question!

+0

On dirait une solution possible à moi, mais je suis vraiment curieux de connaître les performances de celui-ci, je vais comparer beaucoup de chaînes à la fin – Roman

+1

Cet exemple particulier peut être remplacé par 'java.text.Normalizer'. Voir aussi [cette réponse] (http://stackoverflow.com/questions/2397804/java-string-searching-ignoring-accents/2397830#2397830). – BalusC

+0

Les performances sont correctes dans notre cas, car elles ne sont pas souvent invoquées. –

9

Jetez un oeil à International Components for Unicode, il peut faire ce que vous avez besoin.

Edit: voici quelques exemples de code pour vous aider à démarrer (à partir du Javadoc Collator):

// Get the Collator for US English and set its strength to PRIMARY 
Collator usCollator = Collator.getInstance(Locale.US); 
usCollator.setStrength(Collator.PRIMARY); 
if (usCollator.compare("abc", "ABC") == 0) { 
    System.out.println("Strings are equivalent"); 
} 
+0

C'est la seule bonne réponse. – tchrist

0

Qu'en est-stripAccent de Apache Commons?

Removes the accents from a string. 

NOTE: This is a JDK 1.6 method, it will fail on JDK 1.5. 

StringUtils.stripAccents(null)    = null 
StringUtils.stripAccents("")     = "" 
StringUtils.stripAccents("control")   = "control" 
StringUtils.stripAccents("&ecute;clair")  = "eclair" 


Parameters: 
    input - String to be stripped 
Returns: 
    String without accents on the text 

ils ne mentionnent pas l'encodage unicode (et seulement donner l'exemple HTML), vous pouvez faire un essai de toute façon

+0

C'est gentil. Malheureusement, commons-lang 3.0 a été dans l'état bêta pour toujours ... Qui sait quand ils vont enfin sortir cette nouvelle version ... –