web-dev-qa-db-ja.com

Java。文字列を比較するときにアクセントを無視する

問題は簡単です。 Javaに2つの文字列を比較してアクセント付き文字を無視してtrueを返す関数はありますか?

すなわち

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

等しいものを返します。

ありがとう

54
framara

Collat​​or クラスを使用する必要があると思います。強度とロケールを設定でき、文字を適切に比較します。

Java 1.6 APIから:

Collat​​orの強度プロパティを設定して、比較で重要と見なされる差異のレベルを決定できます。 PRIMARY、SECONDARY、TERTIARY、IDENTICALの4つの長所が提供されています。言語機能への強さの正確な割り当てはロケールに依存します。たとえば、チェコ語では、「e」と「f」は一次差異と見なされ、「e」と「ě」は二次差異、「e」と「E」は三次差異、「e」と「e」は同一です。

ここで重要な点(人々が作ろうとしていること)は、 "Joao"と "João"が等しいと見なされるべきでは決してないということですが、並べ替えを行う場合、それらをASCII値を使用すると、Joao、John、Joãoのようになり、これは良くありません。 collat​​orクラスを使用すると、これが正しく処理されます。

63
DaveJohnston

あなたは私からこれを聞いていませんでした(私は質問の前提に同意しないため)、しかしあなたはJava.text.Normalizer、およびNFDで正規化します。これにより、アタッチされている文字からアクセントが分離されます。次に、アクセント文字をフィルタリングして比較できます。

23

または、アクセントを無視して比較/ソートしたい場合は、Apache StringUtilsライブラリの stripAccents を使用します。

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

区別記号を無視するように設定した場合、Collat​​orはaとáに対して0を返します。

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

isSame( "a"、 "á")はtrueを生成します

6
Benny Bottema
public boolean insenstiveStringComparator (String a, String b) {
    Java.text.Collator collate = Java.text.Collator.getInstance();
    collate.setStrength(Java.text.Collator.PRIMARY);
    collate.setDecomposition(Java.text.Collator.CANONICAL_DECOMPOSITION); 
    return collate.equals(a, b);    
}