Java-根据 UTF8 编码获取字符串长度,截取字符串

2023年02月10日 12:46 · 阅读(1048) ·

参考

Java中以字节长度截取存在中文的字符串(UTF-8编码)

获取 UTF8 编码长度

  1. /**
  2. * 获取字符串的 UTF8 编码长度
  3. *
  4. * @param str 字符串
  5. * @return UTF8 编码长度
  6. */
  7. public static int getUtf8Length(String str) {
  8. if (isNotNull(str)) {
  9. return str.getBytes(StandardCharsets.UTF_8).length;
  10. }
  11. return 0;
  12. }

截取方法1

  1. /**
  2. * 根据 UTF8 编码截取字符串
  3. *
  4. * @param str 字符串
  5. * @param subLen 截取长度
  6. * @return 截取后的字符串
  7. */
  8. public static String subStrUtf8(String str, int subLen) {
  9. String subStr = "";
  10. try {
  11. int byteEndIndex = Math.min(str.length(), subLen);
  12. int byteLen = 0;
  13. do {
  14. // 将要截取的子串长度减1,此处切记用 byteEndIndex--,而不是 --byteEndIndex
  15. subStr = str.substring(0, byteEndIndex--);
  16. // 更新subStr转为UTF-8的byte[]的长度
  17. byteLen = subStr.getBytes(StandardCharsets.UTF_8).length;
  18. // 只要byteLen大于最初想要截取的子串的值,则继续循环
  19. } while (byteLen > subLen);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. return subStr;
  24. }

截取方法2

  1. /**
  2. * 根据 UTF8 编码截取字符串
  3. *
  4. * @param str 字符串
  5. * @param beginIndex 起始位置
  6. * @param endIndex 结束位置
  7. * @return 截取后的字符串
  8. */
  9. public static String subStrUtf8(String str, int beginIndex, int endIndex) {
  10. String subStr = "";
  11. try {
  12. int byteEndIndex = Math.min(str.length(), endIndex);
  13. int byteLen = 0;
  14. do {
  15. // 将要截取的子串长度减1,此处切记用 byteEndIndex--,而不是 --byteEndIndex
  16. subStr = str.substring(beginIndex, byteEndIndex--);
  17. // 更新subStr转为UTF-8的byte[]的长度
  18. byteLen = subStr.getBytes(StandardCharsets.UTF_8).length;
  19. // 只要byteLen大于最初想要截取的子串的值,则继续循环
  20. } while (byteLen > endIndex - beginIndex);
  21. } catch (Exception e) {
  22. e.printStackTrace();
  23. }
  24. return subStr;
  25. }

测试

  1. public static void main(String[] args) {
  2. System.out.println(subStrUtf8("1罗马罗马", 10));
  3. System.out.println(subStrUtf8("1罗马罗马", 1, 10));
  4. }

结果

  1. 1罗马罗
  2. 罗马罗