Java. Ignoriere Akzente beim Vergleich von Strings

Das Problem ist einfach. Gibt es irgendeine function in JAVA, um zwei Strings zu vergleichen und wahres Ignorieren der akzentuierten Zeichen zurückzugeben?

dh

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

zurückgeben, die gleich sind.

Vielen Dank

Ich denke du solltest die Collator class benutzen. Hier können Sie eine Stärke und ein Gebietsschema festlegen und die Zeichen entsprechend vergleichen.

Von der Java 1.6-API:

Sie können die Stärkeeigenschaft eines Collators festlegen, um das Niveau der Differenz zu bestimmen, die in Vergleichen als signifikant angesehen wird. Vier Stärken werden bereitgestellt: PRIMÄR, SEKUNDÄR, TERTIÄR und IDENTISCH. Die genaue Zuordnung von Stärken zu Sprachfeatures ist länderabhängig. Zum Beispiel werden im Tschechischen “e” und “f” als primäre Unterschiede betrachtet, während “e” und “ì” sekundäre Unterschiede sind, “e” und “E” Tertiärunterschiede sind und “e” und “e” identisch sind .

Ich denke, der wichtige Punkt hier (was die Leute versuchen zu machen) ist, dass “Joao” und “João” niemals als gleichwertig betrachtet werden sollten, aber wenn man sortiert, will man nicht, dass sie anhand ihres ASCII-Wertes verglichen werden denn dann hättest du so etwas wie Joao, John, João, was nicht gut ist. Die Verwendung der Collator-class behandelt dies definitiv korrekt.

Sie haben das nicht von mir gehört (weil ich mit der Prämisse der Frage nicht einverstanden bin), aber Sie können java.text.Normalizer und mit NFD normalisieren: Dies spaltet den Akzent von dem Buchstaben ab, an den er angehängt ist. Sie können dann die Akzentzeichen herausfiltern und vergleichen.

Collator gibt 0 für a und á zurück, wenn Sie es so konfigurieren, dass diakritische Zeichen ignoriert werden:

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

isSame (“a”, “á”) ergibt wahr

Oder verwende stripAccents aus der apache StringUtils-Bibliothek, wenn du ignorierende Akzente vergleichen / sortieren möchtest:

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

Das Problem mit dieser Art von Konvertierungen ist, dass es nicht immer eine klare Zuordnung von akzentuierten zu nicht akzentuierten Zeichen gibt. Es hängt von Codepages, Lokalisierungen usw. ab. Ist das zum Beispiel ein Akzent, der einem “a” entspricht? Kein Problem für einen Menschen, aber komplizierter für den Computer.

AFAIK Java hat keine integrierte Conversion, die die aktuellen Lokalisierungsoptionen nachschlagen und diese Art von Conversions durchführen kann. Möglicherweise benötigen Sie eine externe Bibliothek, die Unicode besser behandelt, wie ICU ( http://site.icu-project.org/ )