Мы все знаем, что использование метода String equals() для сравнения равенства потерпит неудачу. Вместо этого следует использовать Collator, например:
// we need to detect User Interface locale somehow
Locale uiLocale = Locale.forLanguageTag("da-DK");
// Setting up collator object
Collator collator = Collator.getInstance(uiLocale);
collator.setStrength(Collator.SECONDARY);
collator.setDecomposition(Collator.CANONICAL_DECOMPOSITION);
// strings for equality testing
String test1 = "USA lover Grækenland støtte";
String test2 = "USA lover graekenland støtte";
boolean result = collator.equals(test1, test2);
Теперь этот код работает, то есть результат true , если uiLocale не установлен на датский язык. В таком случае это приведет к ложному. Я, конечно, понимаю , почему это произошло: это только потому, что метод equals реализован следующим образом:
return compare(s1, s2) == Collator.Equal;
Этот метод вызывает тот, который используется для сортировки и проверяет, совпадают ли строки. Это не так, потому что для датских специфических правил сортировки требуется сортировка æ после (если я правильно понял результат метода сравнения) ae. Тем не менее, эти строки действительно одинаковы, с этой силой как разности случаев, так и такие символы совместимости (то, что их называют) следует рассматривать как равные.
Чтобы исправить это, можно использовать RuleBasedCollator с определенным набором правил, который будет работать для случая равенства.
Наконец, возникает вопрос: знает ли кто-нибудь, где я могу получить такие конкретные правила (не только для датчан, но и для других языков), чтобы символы совместимости, лигатуры и т.д. Считались равными (CLDR , похоже, не содержит таких, или я не смог его найти)?
Или, может быть, я хочу сделать что-то глупое здесь, и я должен использовать просто UCA для сравнения равенства (любой пример кода, пожалуйста)?