我使用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
来实现(但显然也处理特殊字符)。
我哪里做错了?
1条答案
按热度按时间oxalkeyp1#
你没有把
"[\\p{InCombiningDiacriticalMarks}]+"
变成Regex
。这产生:
请注意,
ø
中的笔划不是发音符号,它既不能分解为发音符号,也不能分解为发音符号你可以看到这三个看起来都有点不同:奥岛
还请注意,Unicode中还有两个包含组合发音符号的块,分别称为"Combining Diacritical Marks Extended"和"Combining Diacritical Marks Supplement"。