Невозможно удалить определенный диакритический знак

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

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?


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

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

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

ø - это не «о» с диакритическим знаком - это другая буква в скандинавских языках. Если вы хотите сделать это, вы можете просто изменить свой метод, чтобы позаботиться об этом особом случае.

Jesper 04.10.2018 16:00

Это действительно правильно, я не читал всю статью в Википедии, в которой упоминается, что к этой букве могут быть применены диакритические знаки ... плохо! Вы можете отправить ответ, я приму, если хотите =)

Michaël Vreux 04.10.2018 16:07
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
2
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Другие вопросы по теме