将UTF-16字符串拆分为单个字符/字符串

4
我有一个看起来像这样 abc 的字符串,我希望将其拆分为单个字符/字符串。
static List<String> split(String text ) {
    List<String> list = new ArrayList<>(text.length());
    for(int i = 0; i < text.length() ; i++) {
        list.add(text.substring(i, i + 1));
    }
    return list;
}

public static void main(String... args) {
    split("a\uD83D\uDC4Fb\uD83D\uDE42c")
            .forEach(System.out::println);
}

正如您可能已经注意到的那样,我得到了两个奇怪的字符,而不是 < 和 >。
a
?
?
b
?
?
c

那些不是UTF-16字符,这就是问题所在。那些是UTF-32代码点。 - rustyx
正如答案所示,这可以相对容易地完成。但是,一旦你尝试将渲染为单个字形的字符组合起来,它就变成了另一种类型的困难。 - kumesana
3个回答

6
根据Character and String APIs文档,您需要使用代码点来正确处理UTF多字节序列。
"abc".codePoints().mapToObj(Character::toChars).forEach(System.out::println);

将会输出

a

b

c

我该如何将这些“codePoints”转换为字符串? - MAGx2

6
以下内容可以完成该任务:
List<String> split(String text) {
    return text.codePoints()
            .mapToObj(Character::toChars)
            .map(String::valueOf)
            .collect(Collectors.toList());
}

0

有一个由我编写的开源MgntUtils库,其中包含一个实用程序,可以将任何字符串转换为Unicode并反之(正确处理代码点),这可以帮助您解决问题以及了解科学背后的内部工作。以下是一个示例:

下面是代码

String result = "abc";
result = StringUnicodeEncoderDecoder.encodeStringToUnicodeSequence(result);
System.out.println(result);
result = StringUnicodeEncoderDecoder.decodeUnicodeSequenceToString(result);
System.out.println(result);

将会产生以下结果:

\u0061\u1f44f\u0062\u1f642\u0063
abc

这里是一篇文章的链接,介绍了MgntUtils库以及获取它(包括javadoc和源代码)的方法:具有堆栈跟踪过滤、静默字符串解析Unicode转换器和版本比较功能的开源Java库。请查找“字符串Unicode转换器”段落。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接