我正在尝试在验证期间从字符串中删除所有变音符号(有关更多背景信息,请参见下文(。为此,我使用以下代码:
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提到的,问题在于字符"ø"不是带有变音符号的"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");
}