2010-11-29 18 views
6

duplicados posibles:
Java. Ignore accents when comparing strings
Java string searching ignoring accentsJava comparación Unicode

Hola a todos

necesito para comparar cadenas en Java que podría ser como 'Chloe' y 'Chloé '. Necesito que sean iguales. ¿Alguien sabe cuál es la mejor práctica? ¿O hay alguna biblioteca de terceros?

romana

+2

En realidad, no son iguales, a menos que el segundo es el francés de la el inglés (lo que significa que tendrás que traducirlo y hacer una comparación). –

Respuesta

3

Traducimos la cadena "Chloé" a "Chloe" con asignaciones no modificables entre caracteres especiales y su carácter ASCII equivalente, antes de la comparación. Eso funciona bastante bien, pero es torpe y, probablemente, hay algunos personajes especiales que hemos olvidado.

Nuestra solución es como la siguiente:

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; 
} 

Así que siento curiosidad por una buena respuesta a este!

+0

Parece una posible solución para mí, pero tengo mucha curiosidad sobre el rendimiento de esta, voy a comparar muchas cadenas al final – Roman

+1

Este ejemplo en particular se puede reemplazar por 'java.text.Normalizer'. Ver también [esta respuesta] (http://stackoverflow.com/questions/2397804/java-string-searching-ignoring-accents/2397830#2397830). – BalusC

+0

El rendimiento está bien en nuestro caso, ya que no se invoca muchas veces. –

9

Eche un vistazo a International Components for Unicode, puede hacer lo que necesita.

Editar: aquí algunos ejemplos de código para que pueda empezar (desde el Javadoc Compaginadora):

// 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

Esta es la única respuesta correcta. – tchrist

0

¿Qué hay de 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 

que no mencionan la codificación Unicode (y sólo dan ejemplo HTML), es posible que desee darle una oportunidad de todos modos

+0

Eso es bueno. Desafortunadamente, commons-lang 3.0 ha estado en estado beta para siempre ... Quién sabe cuándo finalmente lanzarán esa nueva versión ... –