Ява. Игнорировать акценты при сравнении строк
Проблема проста. Есть ли какая-либо функция в JAVA для сравнения двух строк и возврата true, игнорируя акцентированные символы?
т.е.
String x = "Joao"; String y = "João";
return, которые равны.
- Bash не анализирует кавычки при преобразовании строки в аргументы
- Как проверить, отображается ли один символ в строке?
- как преобразовать строку в дату в mysql?
- Форматировать строки в методе Console.WriteLine
- Конкатенация строк в C, какой метод более эффективен?
благодаря
- ef4 причина Циркулярная ссылка в веб-службе
- Самый эффективный способ конкатенации строк?
- искать текстовый файл с помощью c # и отображать номер строки и полную строку, содержащую ключевое слово поиска
- Есть ли на C # String Tokenizer, например, Java?
- Эффективный способ сравнения строк версии в Java
- Как избежать% в String.Format?
- Как определить, является ли строка числом?
- Длина значения длины строки в mongoDB
Я думаю, вы должны использовать 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/ )