!84 support substring by code point

Merge pull request !84 from Ease/v5-dev
This commit is contained in:
Looly 2019-12-11 11:49:54 +08:00 committed by Gitee
commit 05aff7f94b
2 changed files with 41 additions and 0 deletions

View File

@ -1579,6 +1579,33 @@ public class StrUtil {
return str.toString().substring(fromIndex, toIndex);
}
/**
* 通过CodePoint截取字符串可以截断Emoji
*
* @param str String
* @param fromIndex 开始的index包括
* @param toIndex 结束的index不包括
* @return 字串
*/
public static String subByCodePoint(CharSequence str, int fromIndex, int toIndex) {
if (isEmpty(str)) {
return str(str);
}
if (fromIndex < 0 || fromIndex > toIndex) {
throw new IllegalArgumentException();
}
if (fromIndex == toIndex) {
return EMPTY;
}
StringBuilder sb = new StringBuilder();
int subLen = toIndex - fromIndex;
str.toString().codePoints().skip(fromIndex).limit(subLen).forEach(v -> sb.append(Character.toChars(v)));
return sb.toString();
}
/**
* 截取部分字符串这里一个汉字的长度认为是2
*

View File

@ -219,6 +219,20 @@ public class StrUtilTest {
Assert.assertEquals("ghigh", pre);
}
@Test
public void subByCodePointTest() {
// 🤔👍🍓🤔
String test = "\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53\uD83E\uDD14";
// 不正确的子字符串
String wrongAnswer = StrUtil.sub(test, 0, 3);
Assert.assertNotEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", wrongAnswer);
// 正确的子字符串
String rightAnswer = StrUtil.subByCodePoint(test, 0, 3);
Assert.assertEquals("\uD83E\uDD14\uD83D\uDC4D\uD83C\uDF53", rightAnswer);
}
@Test
public void subBeforeTest() {
String a = "abcderghigh";