kotlin 规格化程序未删除重音符号

nx7onnlm  于 2023-02-16  发布在  Kotlin
关注(0)|答案(1)|浏览(109)

我使用Normalizer,后面跟着一个正则表达式来删除重音符号,但是我得到的是相同的字符串,重音符号仍然存在。

import java.text.*

const val INPUT = "áéíóůø"
fun main() {
    println(Normalizer.normalize(INPUT, Normalizer.Form.NFC).replace("[\\p{InCombiningDiacriticalMarks}]+", ""))
    println(Normalizer.normalize(INPUT, Normalizer.Form.NFD).replace("[\\p{InCombiningDiacriticalMarks}]+", ""))
    println(Normalizer.normalize(INPUT, Normalizer.Form.NFKC).replace("[\\p{InCombiningDiacriticalMarks}]+", ""))
    println(Normalizer.normalize(INPUT, Normalizer.Form.NFKD).replace("[\\p{InCombiningDiacriticalMarks}]+", ""))
}

输出:
艾尤乌岛
a ́ e ́ i ́ o ́ u岛
艾尤乌岛
a ́ e ́ i ́ o ́ u岛
KotlinPlayground:https://pl.kotl.in/62l6rUEUm
我在这里读到了很多问题,它们说在Java/Kotlin中去掉重音符号的方法是使用java.text.Normalizer加上上述正则表达式的一些小的变化(有时没有方括号,有时没有加号)。甚至Apache Common的stripAccent函数也使用Normalizer来实现(但显然也处理特殊字符)。
我哪里做错了?

oxalkeyp

oxalkeyp1#

你没有把"[\\p{InCombiningDiacriticalMarks}]+"变成Regex

println(
    Normalizer.normalize(INPUT, Normalizer.Form.NFD)
        .replace("[\\p{InCombiningDiacriticalMarks}]+".toRegex(), "")
)

这产生:

aeiouø

请注意,ø中的笔划不是发音符号,它既不能分解为发音符号,也不能分解为发音符号

  • "o"和U +0338组合长实心覆盖层,或;
  • "o"和U +0337组合短实心覆盖层

你可以看到这三个看起来都有点不同:奥岛
还请注意,Unicode中还有两个包含组合发音符号的块,分别称为"Combining Diacritical Marks Extended"和"Combining Diacritical Marks Supplement"。

相关问题