如何对包含 4 个字节字符的字符串进行子字符串化?

How to substring a String containing 4 bytes characters?

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

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

您可以使用 offsetByCodePoints 来帮助找到 5 个代码点之后的字符的索引,然后将其用作 substring:

的第二个参数
String s = "\uD83D\uDC4D1234\uD83D\uDC4D";
String sub = s.substring(0, s.offsetByCodePoints(0, 5));

Ideone Demo