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

Проблема проста. Есть ли какая-либо функция в 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/ )

  • Равная высота элементов внутри элемента сетки с раскладкой сетки CSS
  • Строковые литералы: куда они идут?
  • Как разбить строку, разделенную запятой?
  • Android: что-то лучше, чем андроид: ellipsize = "end", чтобы добавить "..." в укороченные длинные строки?
  • Utils для чтения текстового файла ресурсов в String (Java)
  • Получить индекс n-го вхождения строки?
  • Разделить строку на слова несколькими разделителями
  • Выделить выбранную строку ListView
  • C ++ printf с std :: string?
  • Формат метода (String, Object ) в типе String не применим для аргументов (...)
  • Определите, является ли строка C допустимым int в C
  • Interesting Posts

    Как преобразовать 2D-точки в 3D?

    Шаблон Java Regex, который соответствует любому онлайн-тестеру, но не в Eclipse

    Как сохранить секретность потребителя OAuth безопасным и как реагировать, когда он скомпрометирован?

    Каков наилучший способ проверить, является ли String целое число на Java?

    Интеграция Java-R?

    Внедрение HWND во внешний процесс с использованием SetParent

    Не удалось найти стиль «координаторLayoutStyle» в текущей теме

    Как установить переменную системной среды в C #?

    Как включить Intel VT-x?

    Как точно определяются одновременные пользователи для приложения Firebase?

    Wake on LAN перестала работать после установки Windows 7

    Как конвертировать секунды в часы, минуты и секунды?

    Структура данных, поддерживающая O (1) случайный доступ и наихудший вариант O (1)?

    Java JFrame .setSize (x, y) не работает?

    Протяните строку с переполнением данных, имея несколько строк в одной полосе

    Давайте будем гением компьютера.