Джава. Игнорировать акценты при сравнении строк - PullRequest
52 голосов
/ 03 марта 2010

Проблема проста. Есть ли в JAVA какая-либо функция для сравнения двух строк и возврата true, игнорируя акцентированные символы?

е

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

возврат, равный.

Спасибо

Ответы [ 5 ]

62 голосов
/ 03 марта 2010

Я думаю, вы должны использовать класс Collator . Он позволяет вам установить силу и локаль, и он будет соответствующим образом сравнивать символы.

Из API Java 1.6:

Вы можете установить силу Collator свойство определять уровень разница считается значительной в сравнения. Четыре сильные стороны при условии: ПЕРВИЧНЫЙ, ВТОРИЧНЫЙ, ТРЕТИЙНЫЙ И ИДЕНТИЧНЫЙ. Точный назначение сильных сторон языку особенности зависят от локали. За Например, на чешском языке, «е» и «F» являются считаются основными отличиями, в то время как «е» и «е» вторичные различия, «е» и «е» - третичные различия и «е» и «е» идентичны.

Я думаю, что важный момент (который пытаются сделать люди) заключается в том, что «Жуан» и «Жуан» никогда не следует рассматривать как равные, но если вы делаете сортировку, вы не хотите, чтобы их сравнивали на основе их значение ASCII, потому что тогда у вас будет что-то вроде Joao, John, João, что не очень хорошо. Использование класса collator определенно обрабатывает это правильно.

23 голосов
/ 03 марта 2010

Вы не слышали этого от меня (потому что я не согласен с предпосылкой вопроса), но вы можете использовать java.text.Normalizer и нормализовать с помощью NFD: это отделяет ударение от письма, к которому он прикреплен , Затем вы можете отфильтровать символы ударения и сравнить.

6 голосов
/ 19 октября 2016

Collator возвращает 0 для a и á, если вы настроили его на игнорирование диакритических знаков:

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

isSame ("a", "á") возвращает true

5 голосов
/ 14 апреля 2017

Или используйте stripAccents из библиотеки apache StringUtils, если вы хотите сравнивать / сортировать игнорируя акценты:

 public int compareStripAccent(String a, String b) {
    return StringUtils.stripAccents(a).compareTo(StringUtils.stripAccents(b));
}
0 голосов
/ 03 марта 2010

Проблема такого рода преобразований заключается в том, что не всегда существует четкое сопоставление символов с ударением на символы без акцента. Это зависит от кодовых страниц, локализаций и т. Д. Например, это с ударением, эквивалентным «а»? Не проблема для человека, но сложнее для компьютера.

AFAIK Java не имеет встроенного преобразования, которое может искать текущие параметры локализации и делать такого рода преобразования. Вам может потребоваться некоторая внешняя библиотека, которая лучше обрабатывает юникод, например ICU (http://site.icu -project.org / )

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...