【问题标题】:Cannot remove a specific diacritical mark无法删除特定的变音符号
【发布时间】:2019-03-09 21:53:02
【问题描述】:

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

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”?


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

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

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

【问题讨论】:

  • ø 不是带有变音符号的 o - 它是斯堪的纳维亚语言中的不同字母。如果你想这样做,那么你可以修改你的方法来处理这种特殊情况。
  • 这实际上是正确的,我没有阅读完整的维基百科文章,确实提到这封信本身可以应用变音符号......我的错!如果你愿意,你可以发布一个我会接受的答案 =)

标签: java pattern-matching diacritics character-class


【解决方案1】:

所以就像 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-02-02
    • 1970-01-01
    • 2020-04-05
    • 2011-06-13
    • 2011-09-28
    • 2019-03-03
    • 2011-06-15
    • 2020-11-03
    • 1970-01-01
    相关资源
    最近更新 更多