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