kotlin 使用代码点将 utf 字符串拆分为单个长度的子字符串
kotlin split utf string into single length sub strings using codepoint
我刚开始使用 kotlin,所以我确信有一种简单的方法可以做到这一点,但我没有看到。我想使用代码点将 a 拆分为单一长度的子字符串。在 Java 8 中,这个有效:
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());
}
}
输出为:
Test string:こんにちは皆さん
Result:こ, ん, に, ち, は, 皆, さ, ん,
我将如何在科特林中做到这一点?尽管它很笨拙,但我可以找到代码点,而且我确定我做错了。但我无法从代码点返回到字符串。整个 string/character 界面对我来说似乎不同,我就是不明白。
谢谢
史蒂夫·S.
您使用的运行时与 Java 相同,因此代码基本上做同样的事情。但是,Kotlin 版本更短,也不需要 class,尽管您可以将实用程序方法分组到一个对象中。这是使用顶级函数的版本:
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(", ")}")
}
输出:
Test string: こんにちは皆さん
Result: こ, ん, に, ち, は, 皆, さ, ん
注意:我重命名了该函数,因为编码并不重要,因为您只是按代码点拆分。
有些人可能会在没有局部变量的情况下这样写:
fun splitByCodePoint(str: String): Array<String> {
return str.codePoints().toArray().let { codepoints ->
Array(codepoints.size) { index -> String(codepoints, index, 1) }
}
}
另请参阅:
Kotlin stdlib Array initializer 按索引 w/lambda
Kotlin stdlib let 函数
我刚开始使用 kotlin,所以我确信有一种简单的方法可以做到这一点,但我没有看到。我想使用代码点将 a 拆分为单一长度的子字符串。在 Java 8 中,这个有效:
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());
}
}
输出为:
Test string:こんにちは皆さん
Result:こ, ん, に, ち, は, 皆, さ, ん,
我将如何在科特林中做到这一点?尽管它很笨拙,但我可以找到代码点,而且我确定我做错了。但我无法从代码点返回到字符串。整个 string/character 界面对我来说似乎不同,我就是不明白。
谢谢 史蒂夫·S.
您使用的运行时与 Java 相同,因此代码基本上做同样的事情。但是,Kotlin 版本更短,也不需要 class,尽管您可以将实用程序方法分组到一个对象中。这是使用顶级函数的版本:
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(", ")}")
}
输出:
Test string: こんにちは皆さん
Result: こ, ん, に, ち, は, 皆, さ, ん
注意:我重命名了该函数,因为编码并不重要,因为您只是按代码点拆分。
有些人可能会在没有局部变量的情况下这样写:
fun splitByCodePoint(str: String): Array<String> {
return str.codePoints().toArray().let { codepoints ->
Array(codepoints.size) { index -> String(codepoints, index, 1) }
}
}
另请参阅:
Kotlin stdlib Array initializer 按索引 w/lambda
Kotlin stdlib let 函数