2

我有一个可以包含 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);
    }
});

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

4

1 回答 1

3

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

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

Ideone 演示

于 2017-06-22T15:44:19.287 回答