Как узнать, содержит ли строка ударения - PullRequest
8 голосов
/ 05 мая 2010

Как узнать, содержит ли строка ударения?

Ответы [ 3 ]

13 голосов
/ 05 мая 2010

Я думаю, что лучшее, что вы можете сделать, это использовать нормализатор, который разбивает символы Юникод с акцентами на два отдельных символа. Java включает это в класс Normalizer, см. здесь .

Это, например, разделит

U+00C1    LATIN CAPITAL LETTER A WITH ACUTE

в

U+0041    LATIN CAPITAL LETTER A
U+0301    COMBINING ACUTE ACCENT

и будет делать это для каждого символа, имеющего акценты или другие диакритические знаки (http://en.wikipedia.org/wiki/Diacritic).

Затем вы можете проверить, есть ли в полученном CharSequence какой-либо символ акцента (и это подразумевает жесткое их кодирование), или просто проверить, равна ли нормализованная версия начальной версии, это будет означать, что любой персонаж, который был разложен. Java Normalizer уже имеет эту возможность в isNormalized(CharSequence src, Normalizer.Form form), но вы должны проверить различные доступные формы, чтобы увидеть, подходит ли одна для ваших нужд.

РЕДАКТИРОВАТЬ: если вам просто нужны базовые поддержки акцента (например, просто é é à ò ì ù), вы можете просто использовать опцию oedo, если вам нужна полная поддержка всех существующих акцентов, это было бы сумасшествием жестко закодировать их все ..

5 голосов
/ 05 марта 2011

Правильный способ сделать это - использовать normalize(str,NFD) из java.text.Normalizer, а затем удалить символы общей категории Mark \pM или Non-Spacing Mark \p{Mn}. Java не поддерживает стандартное свойство Unicode \p{Diacritic}, или вы можете использовать это. Обратите внимание, что не все диакритические знаки не являются пробелами, и наоборот.

Однако, это, вероятно, неправильно. Если вы пытаетесь выполнить нечувствительный к акценту поиск и сравнение строк, правильный способ сделать это - оставить строки как есть. Вам необходимо создать объект сопоставления UCA с уровнем, установленным в 1 (или, скорее, PRIMARY), а затем использовать его для сравнения ваших строк. Если строки в первичной силе сравниваются одинаково, это игнорирует такие вещи, как знаки ударения.

Вот примеры на Java о том, как сделать это с помощью класса Collator ICU. Если вы используете надлежащие коллатера UCA , то вам не нужно нормализоваться; они позаботятся об этом для вас.

Этот ответ в Perl использует два объекта-коллатера UCA, один на первичной силе, чтобы полностью игнорировать акценты для поиска и сравнения строк, а другой, который позволяет различать диакритические знаки на вторичной силе, как обычно Unicode.

5 голосов
/ 05 мая 2010
if (Pattern.matches(".*[éèàù].*", input)) {
  ....
}

добавить в этот список любые акценты, которые вы хотите

...