Ява. Игнорировать акценты при сравнении строк

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

т.е.

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

return, которые равны.

благодаря

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

Из API Java 1.6:

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

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

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

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

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

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

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

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

  • Строка неизменна. В чем же смысл?
  • Выделить выбранную строку ListView
  • Лучший способ заменить многие строки - обфускация в C #
  • Как обрезать пробелы из строки Python?
  • В C, почему я не могу назначить строку массиву символов после ее объявления?
  • Объединение нулевых строк в Java
  • Конкатенация строк: оператор concat () vs "+"
  • Как запустить TestNG из командной строки
  • Удалить пробел из строки в Objective-C
  • Преобразование секретного ключа в строку и наоборот
  • Java: String split (): Я хочу, чтобы он включал пустые строки в конце
  • Давайте будем гением компьютера.