删除Kotlin中的重音符号和变音符号

cunj1qz1  于 7个月前  发布在  Kotlin
关注(0)|答案(5)|浏览(108)

有没有办法在Kotlin中将字符串"Dziekujje“转换为”Dziekuje“或将字符串”šeer“转换为”secer“。我试过使用java.text.Normalizer,但似乎无法按照预期的方式工作。

deyfvvtc

deyfvvtc1#

Normalizer只做了一半的工作。以下是如何使用它:

private val REGEX_UNACCENT = "\\p{InCombiningDiacriticalMarks}+".toRegex()

fun CharSequence.unaccent(): String {
    val temp = Normalizer.normalize(this, Normalizer.Form.NFD)
    return REGEX_UNACCENT.replace(temp, "")
}

assert("áéíóů".unaccent() == "aeiou")

字符串
它是这样工作的:
我们调用normalize()。如果我们传递à,该方法返回**a + **。然后使用正则表达式,我们清理字符串以仅保留有效的US-ASCII字符。 来源:[http://www.rgagnon.com/javadetails/java-0456.html](http://www.rgagnon.com/javadetails/java-0456.html) 请注意,Normalizer`是一个Java类;这不是纯粹的Kotlin,它只能在JVM上工作。

68bkxrlz

68bkxrlz2#

TL;DR:

1.使用Normalizer对Unicode thext进行规范分解。
1.删除非空格组合字符(\p{Mn})。

fun String.removeNonSpacingMarks() =
    Normalizer.normalize(this, Normalizer.Form.NFD)
    .replace("\\p{Mn}+".toRegex(), "")

字符串

长回答:

使用Normalizer可以将原始文本转换为等效的合成或分解形式。

  • NFD:典型分解。
  • NFC:规范分解,然后是规范合成。

x1c 0d1x的值。
(more有关标准化的信息,请参见Unicode® Standard Annex #15
在我们的例子中,我们对NFD规范化形式感兴趣,因为它允许我们从基本字符中分离出所有组合字符。
在分解文本之后,我们必须运行一个正则表达式来删除所有分解后产生的新字符,这些新字符对应于组合字符。
组合字符是相对于相关基本字符定位的特殊字符。Unicode标准区分两种类型的组合字符:空格和非空格。
我们只对非空格组合字符感兴趣。音调符号是这组字符中的主要类别(但不是唯一的类别),用于拉丁语、希腊语和西里尔语及其相关文字。
要删除正则表达式中的非空格字符,我们必须使用\p{Mn}
其他答案使用\p{InCombiningDiacriticalMarks},此区块只包含组合的音调符号。它是\p{Mn}子集,只包含112 characters

bxpogfeg

bxpogfeg3#

这是一个扩展函数,您可以使用并进一步扩展:

fun String.normalize(): String {
    val original = arrayOf("ę", "š")
    val normalized =  arrayOf("e", "s")

    return this.map { it ->
        val index = original.indexOf(it.toString())
        if (index >= 0) normalized[index] else it
    }.joinToString("")
}

字符串
使用方法如下:

val originalText = "aębšc"
val normalizedText = originalText.normalize()
println(normalizedText)


将打印
第一个月
扩展数组originalnormalized,并添加所需的元素。

yquaqz18

yquaqz184#

你只需要使用Normalizer类的这个方法:

fun String.removeAccents() =
    Normalizer.normalize(this, Normalizer.Form.NFD)

字符串
范例:

var words ="Dziękuję šećer aębšc áéíóů canción ñiña Ioana"
 println("${words.unaccent()}")


产出:

Dziekuje secer aebsc aeiou cancion nina Ioana

4bbkushb

4bbkushb5#

如果有人正在努力在Kotlin中做到这一点,这段代码就像一个魅力。为了避免不一致,我还使用.toUpperCase和Trim()。然后我转换这个函数:

fun stripAccents(s: String):String{

if (s == null) {
        return "";
    }

    val chars: CharArray = s.toCharArray()

    var sb = StringBuilder(s)
    var cont: Int = 0

    while (chars.size > cont) {
        var c: kotlin.Char
        c = chars[cont]
        var c2:String = c.toString()
       //these are my needs, in case you need to convert other accents just Add new entries aqui
        c2 = c2.replace("Ã", "A")
        c2 = c2.replace("Õ", "O")
        c2 = c2.replace("Ç", "C")
        c2 = c2.replace("Á", "A")
        c2 = c2.replace("Ó", "O")
        c2 = c2.replace("Ê", "E")
        c2 = c2.replace("É", "E")
        c2 = c2.replace("Ú", "U")

        c = c2.single()
        sb.setCharAt(cont, c)
        cont++

    }

    return sb.toString()

}

字符串
要使用这些有趣的代码,请像这样转换:

var str: String
str = editText.text.toString() //get the text from EditText
str = str.toUpperCase().trim()

str = stripAccents(str) //call the function

相关问题