Я пытаюсь удалить все диакритические знаки из строки во время проверки (дополнительные сведения см. Ниже). Для этого я использую следующий код:
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?
Что касается ПОЧЕМУ мне это нужно, немного предыстории:
Я отправляю данные, содержащие скандинавские символы, наружу, и когда они отправляют данные обратно, у них появляется забавная привычка удалять или даже заменять диакритические знаки (например, ø становится ö). Я пытался заставить их сделать это правильно, но просто не смог, и у меня нет возможности заставить их это сделать.
Итак, чтобы сравнить данные и убедиться, что отправлено именно то, что мы получаем обратно, я должен удалить все диакритические знаки, чтобы избежать множества ложных срабатываний.
Это действительно правильно, я не читал всю статью в Википедии, в которой упоминается, что к этой букве могут быть применены диакритические знаки ... плохо! Вы можете отправить ответ, я приму, если хотите =)




Итак, как упоминал Джеспер, проблема в том, что символ «ø» НЕ является «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");
}
ø - это не «о» с диакритическим знаком - это другая буква в скандинавских языках. Если вы хотите сделать это, вы можете просто изменить свой метод, чтобы позаботиться об этом особом случае.