无法删除特定的变音符号

Cannot remove a specific diacritical mark

我试图在验证期间从字符串中删除所有变音符号(有关更多背景信息,请参见下文)。为此,我使用了以下代码:

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

我的问题是这对字符“ø”不起作用,它保持原样。往上看class"InCombiningDiacriticalMarks"这个字,发现了这个问题:What built-in regex character classes are supported Java

这让我找到了官方的 unicode 列表,列出了所有被认为是变音符号的东西,这里是:https://www.unicode.org/charts/PDF/U0300.pdf,代码点 0338 似乎与“ø”非常匹配。

我是不是遗漏了什么,或者字符 class "InCombiningDiacriticalMarks" 在 java 中没有得到完全支持?


至于为什么我需要这个,一些背景:

我正在向外部发送包含斯堪的纳维亚字符的数据,当他们将数据发回时,他们有一个有趣的习惯,即删除甚至替换变音符号(例如 ø 变为 ö)。我试图让他们做对,但就是做不到,我也没有办法强迫他们。

因此,为了比较数据以验证发送的是我们收到的,我必须删除所有变音符号以避免大量误报。

所以就像 Jesper 提到的那样,问题在于字符“ø”不是带有变音符号的 "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");
}