我有一个可以包含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);
}
});
我敢打赌,应该有一种更好,更有效的代码来实现这一目标。
答案 0 :(得分:3)
您可以使用offsetByCodePoints
来帮助查找5个代码点后面的字符索引,然后将其用作substring
的第二个参数:
String s = "\uD83D\uDC4D1234\uD83D\uDC4D";
String sub = s.substring(0, s.offsetByCodePoints(0, 5));