如何子字符串包含4个字节字符的字符串?

时间:2017-06-22 15:29:41

标签: java string unicode utf-16 codepoint

我有一个可以包含4个字节字符的字符串。例如:

String s = "\uD83D\uDC4D1234\uD83D\uDC4D";

我也有一个大小,我应该用来从中获取子串。大小以字符为单位。所以假设大小是5,所以我应该得到前4个字节字符和“1234”。

直接使用子字符串作为s.substring(0, 5)会返回错误的结果,返回第一个字符,只返回“123”。

我可以通过这种方式使用代码点来获得正确的结果:

String s = "\uD83D\uDC4D1234\uD83D\uDC4D";
StringBuffer buf = new StringBuffer();
long size = 5;
s.codePoints().forEachOrdered(charInt -> {
    if(buf.codePoints().count() < size) {
        buf.appendCodePoint(charInt);
    }
});

我敢打赌,应该有一种更好,更有效的代码来实现这一目标。

1 个答案:

答案 0 :(得分:3)

您可以使用offsetByCodePoints来帮助查找5个代码点后面的字符索引,然后将其用作substring的第二个参数:

String s = "\uD83D\uDC4D1234\uD83D\uDC4D";
String sub = s.substring(0, s.offsetByCodePoints(0, 5));

Ideone Demo