参考
获取 UTF8 编码长度
/**
* 获取字符串的 UTF8 编码长度
*
* @param str 字符串
* @return UTF8 编码长度
*/
public static int getUtf8Length(String str) {
if (isNotNull(str)) {
return str.getBytes(StandardCharsets.UTF_8).length;
}
return 0;
}
截取方法1
/**
* 根据 UTF8 编码截取字符串
*
* @param str 字符串
* @param subLen 截取长度
* @return 截取后的字符串
*/
public static String subStrUtf8(String str, int subLen) {
String subStr = "";
try {
int byteEndIndex = Math.min(str.length(), subLen);
int byteLen = 0;
do {
// 将要截取的子串长度减1,此处切记用 byteEndIndex--,而不是 --byteEndIndex
subStr = str.substring(0, byteEndIndex--);
// 更新subStr转为UTF-8的byte[]的长度
byteLen = subStr.getBytes(StandardCharsets.UTF_8).length;
// 只要byteLen大于最初想要截取的子串的值,则继续循环
} while (byteLen > subLen);
} catch (Exception e) {
e.printStackTrace();
}
return subStr;
}
截取方法2
/**
* 根据 UTF8 编码截取字符串
*
* @param str 字符串
* @param beginIndex 起始位置
* @param endIndex 结束位置
* @return 截取后的字符串
*/
public static String subStrUtf8(String str, int beginIndex, int endIndex) {
String subStr = "";
try {
int byteEndIndex = Math.min(str.length(), endIndex);
int byteLen = 0;
do {
// 将要截取的子串长度减1,此处切记用 byteEndIndex--,而不是 --byteEndIndex
subStr = str.substring(beginIndex, byteEndIndex--);
// 更新subStr转为UTF-8的byte[]的长度
byteLen = subStr.getBytes(StandardCharsets.UTF_8).length;
// 只要byteLen大于最初想要截取的子串的值,则继续循环
} while (byteLen > endIndex - beginIndex);
} catch (Exception e) {
e.printStackTrace();
}
return subStr;
}
测试
public static void main(String[] args) {
System.out.println(subStrUtf8("1罗马罗马", 10));
System.out.println(subStrUtf8("1罗马罗马", 1, 10));
}
结果
1罗马罗
罗马罗