0

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

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

我的问题是这不适用于字符 "ø" ,它保持原样。在查看了字符类“InCombiningDiacriticalMarks”之后,我发现了这个问题:What built-in regex character classes are supported Java

这将我带到了所有被认为是变音标记的官方 unicode 列表,这里:https : //www.unicode.org/charts/PDF/U0300.pdf ,代码点 0338 似乎与“ø”匹配得很好。

我是否遗漏了什么,或者 java 中不完全支持字符类“InCombiningDiacriticalMarks”?


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

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

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

4

1 回答 1

0

所以就像 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");
}
于 2018-10-16T05:48:56.470 回答