Не удается удалить определенный диакритический знак - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь удалить все диакритические знаки из строки во время проверки (дополнительную информацию см. Ниже).Чтобы сделать это, я использую следующий код:

private static String stripAccents(final String s) {
    if(s == null) {
        return "";
    }
    return Normalizer.normalize(s, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "");
}

Моя проблема в том, что это не работает для символа "ø", который остается как есть.После поиска класса символов «InCombiningDiacriticalMarks» я обнаружил вопрос: Какие встроенные классы символов регулярного выражения поддерживаются Java

Это привело меня к официальному списку Unicode всего, что считается диакритическимотметьте здесь: https://www.unicode.org/charts/PDF/U0300.pdf, и кодовая точка 0338, кажется, очень хорошо соответствует "ø".

Я что-то упустил, или класс символов "InCombiningDiacriticalMarks" не полностью поддерживаетсяв java?


Относительно того, ПОЧЕМУ мне это нужно, некоторые сведения:

Я отправляю данные, содержащие скандинавские символы, наружу, и когда они отправляют данные обратноу них есть забавная привычка удалять или даже заменять диакритические знаки (например, ø становится ö).Я пытался заставить их делать это правильно, но просто не буду, и у меня нет никакого способа заставить их сделать это.

Итак, чтобы сравнить данные, чтобы убедиться, что то, что было отправлено, мы получаем обратно, янеобходимо удалить все диакритические знаки, чтобы избежать тонны ложных срабатываний.

1 Ответ

0 голосов
/ 16 октября 2018

Так что, как упоминал Джеспер, проблема в том, что символ «ø» НЕ является «o» с диакритическим знаком, но считается полноценным символом, который сам может принимать диакритические знаки, как «ø̈» в«Grø̈nland» (см. https://en.wikipedia.org/wiki/%C3%98).

. В результате единственный способ программно преобразовать «ø» в «o» (что мне и было нужно) - это явно заменить «ø» на «о ". Таким образом, упомянутый выше метод становится:

private String stripAccents(final String s) {
    if(s == null) {
        return "";
    }
    return Normalizer.normalize(s, Normalizer.Form.NFD).replaceAll("[\\p{InCombiningDiacriticalMarks}]", "").replaceAll("ø", "o");
}
...