Java. Ignorar acentos al comparar cadenas

El problema es fácil. ¿Hay alguna función en JAVA para comparar dos cadenas y devolver verdadero ignorando los caracteres acentuados?

es decir

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

retorno que son iguales.

Gracias

Creo que deberías estar usando la clase Collator . Le permite establecer una fortaleza y configuración regional y comparará los caracteres de forma apropiada.

Desde la API de Java 1.6:

Puede establecer la propiedad de resistencia de un Clasificador para determinar el nivel de diferencia considerado significativo en las comparaciones. Se proporcionan cuatro puntos fuertes: PRIMARIO, SECUNDARIO, TERCIARIO e IDENTICO. La asignación exacta de las fortalezas a las características del lenguaje depende de la configuración regional. Por ejemplo, en checo, “e” y “f” se consideran diferencias principales, mientras que “e” y “ě” son diferencias secundarias, “e” y “E” son diferencias terciarias y “e” y “e” son idénticas .

Creo que el punto importante aquí (que las personas están tratando de hacer) es que “Joao” y “João” nunca deberían considerarse iguales, pero si está haciendo la clasificación no quiere que se comparen en función de su valor ASCII porque entonces tendrías algo como Joao, John, João, que no es bueno. El uso de la clase de clasificador definitivamente maneja esto correctamente.

Usted no escuchó esto de mí (porque estoy en desacuerdo con la premisa de la pregunta), pero puede usar java.text.Normalizer y normalizar con NFD : esto separa el acento de la letra a la que está adjuntado. A continuación, puede filtrar los caracteres de acento y comparar.

Collator devuelve 0 para a y á, si lo configura para ignorar signos diacríticos:

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

isSame (“a”, “á”) produce verdadero

O use stripAccents de la biblioteca StringUtils de apache si quiere comparar / ordenar los acentos ignorados:

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

El problema con este tipo de conversiones es que no siempre hay una asignación clara de caracteres acentuados a no acentuados. Depende de las páginas de códigos, las localizaciones, etc. Por ejemplo, ¿es esto un acento equivalente a una “a”? No es un problema para un humano, sino un truco para la computadora.

AFAIK Java no tiene una conversión integrada que pueda buscar las opciones de localización actuales y realizar este tipo de conversiones. Es posible que necesite alguna biblioteca externa que maneje mejor unicode, como ICU ( http://site.icu-project.org/ )