Где я могу найти конкретный набор правил сопоставления для сравнения строк на равенство?

Все мы знаем, что использование метода equals () String для сравнения на равенство потерпит неудачу.Вместо этого следует использовать 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);

Теперь этот код работает, то есть результат будет истинным , если uiLocale не установлен на датский. В таком случае будет false. Я, конечно, понимаю , почему это произошло: это просто потому, что метод equals реализован следующим образом:

return compare(s1, s2) == Collator.Equal;

Этот метод вызывает метод, который используется для сортировки и проверки совпадения строк. Это не так, потому что датские правила сопоставления требуют, чтобы æ были отсортированы после (если я правильно понимаю результат метода сравнения) ae . Однако эти строки на самом деле одинаковы, с этой силой как различия в регистре, так и такие символы совместимости (так они называются) должны рассматриваться как равные.

Чтобы исправить это, можно использовать RuleBasedCollator с определенным набором правил, которые будут работать для случая равенства.
Наконец, вопрос: знает ли кто-нибудь, где я могу получить такие конкретные правила (не только для датского, но и для других языков), чтобы символы совместимости, лигатуры и т. Д. Считались одинаковыми ( CLDR диаграмма , похоже, не содержит таких, или мне не удалось ее найти)?

Или, может быть, я хочу сделать здесь что-то глупое, и мне действительно следует использовать просто UCA для сравнения на равенство (любой код образец, пожалуйста)?

15
задан Paweł Dyda 1 January 2012 в 18:00
поделиться