Kotlin使用代码点将utf字符串拆分为单个长度的子字符串

时间:2018-12-16 03:12:39

标签: unicode kotlin codepoint

我只是开始Kotlin,所以我敢肯定有一个简单的方法可以做到这一点,但是我看不到。我想使用代码点将a分成单个长度的子字符串。在Java 8中,此方法有效:

localhost

输出为:

public class UtfSplit {
    static String [] utf8Split (String str) {
        int [] codepoints = str.codePoints().toArray();
        String [] rv = new String[codepoints.length];
        for (int i = 0; i < codepoints.length; i++)
            rv[i] = new String(codepoints, i, 1);
        return rv;
    }
    public static void main(String [] args) {
        String test = "こんにちは皆さん";
        System.out.println("Test string:" + test);
        StringBuilder sb = new StringBuilder("Result:");
        for(String s : utf8Split(test))
            sb.append(s).append(", ");
        System.out.println(sb.toString());
    }
}

我将如何在Kotlin中这样做?尽管代码笨拙,但我可以找到代码点,而且我确定自己做错了。但是我无法从代码点回到字符串。整个字符串/字符界面对我来说似乎不一样,我只是不明白。

谢谢 史蒂夫·S。

1 个答案:

答案 0 :(得分:1)

您使用与Java相同的运行时,因此代码基本上在做相同的事情。但是,尽管您可以将实用程序方法分组为一个对象,但Kotlin版本较短,并且也不需要类。这是使用顶级功能的版本:

fun splitByCodePoint(str: String): Array<String> {
    val codepoints = str.codePoints().toArray()
    return Array(codepoints.size) { index ->
        String(codepoints, index, 1)
    }
}

fun main(args: Array<String>) {
    val input = "こんにちは皆さん"
    val result = splitByCodePoint(input)

    println("Test string: ${input}")
    println("Result:      ${result.joinToString(", ")}")
}

输出:

  

测试字符串:こんにちは皆さん

     

结果:こ,ん,に,ち,は,皆,さ,ん

注意:我对函数进行了重命名,因为编码并不重要,因为您只是按Codepoints进行拆分。

有些人可能会这样写,而没有局部变量:

fun splitByCodePoint(str: String): Array<String> {
    return str.codePoints().toArray().let { codepoints ->
        Array(codepoints.size) { index -> String(codepoints, index, 1) }
    }
}

另请参阅: