diff --git a/CHANGELOG.md b/CHANGELOG.md index 790f277ab..3d0169589 100755 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ * 【core 】 Ipv4Util 新增方法:检测指定 IP 地址是否匹配通配符(pr#3171@Github) * 【core 】 DateUtil.parse适配6位毫秒格式(issue#I7H34N@Gitee) * 【core 】 RandomUtil增加可选是否包含边界的重载(issue#3182@Github) +* 【core 】 StrUtil增加truncateByByteLength方法(pr#3176@Github) ### 🐞Bug修复 * 【core 】 修复MapUtil工具使用filter方法构造传入参数结果问题(issue#3162@Github) diff --git a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java index e275c18ca..4621da6d4 100755 --- a/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/util/StrUtil.java @@ -487,20 +487,6 @@ public class StrUtil extends CharSequenceUtil implements StrPool { return truncateByByteLength(str, charset, maxBytes, 4, true); } - /** - * 截断字符串,使用其按照GB18030编码为字节后不超过maxBytes长度。截断后自动追加省略号(...) - * 用于存储数据库varchar且编码为GB2312,GBK,GB18030的字段 - * - * @param str - * @param maxBytes - * @return - */ - public static String truncateGb18030(String str, int maxBytes) { - Charset charset = Charset.forName("GB18030"); - //GB18030编码单个字符最大长度2 - return truncateByByteLength(str, charset, maxBytes, 2, true); - } - /** * 截断字符串,使用其按照指定编码为字节后不超过maxBytes长度 * @@ -517,25 +503,25 @@ public class StrUtil extends CharSequenceUtil implements StrPool { if (str == null || str.length() * factor <= maxBytes) { return str; } - byte[] sba = str.getBytes(charset); + final byte[] sba = str.getBytes(charset); if (sba.length <= maxBytes) { return str; } //限制字节数 - int limitBytes; + final int limitBytes; if (appendDots) { limitBytes = maxBytes - "...".getBytes(charset).length; } else { limitBytes = maxBytes; } - ByteBuffer bb = ByteBuffer.wrap(sba, 0, limitBytes); - CharBuffer cb = CharBuffer.allocate(limitBytes); - CharsetDecoder decoder = charset.newDecoder(); + final ByteBuffer bb = ByteBuffer.wrap(sba, 0, limitBytes); + final CharBuffer cb = CharBuffer.allocate(limitBytes); + final CharsetDecoder decoder = charset.newDecoder(); //忽略被截断的字符 decoder.onMalformedInput(CodingErrorAction.IGNORE); decoder.decode(bb, cb, true); decoder.flush(cb); - String result = new String(cb.array(), 0, cb.position()); + final String result = new String(cb.array(), 0, cb.position()); if (appendDots) { return result + "..."; } diff --git a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java index ed3044f7e..03c4d1bae 100755 --- a/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/util/StrUtilTest.java @@ -652,7 +652,7 @@ public class StrUtilTest { @Test public void truncateUtf8Test() { - String str = "这是This一段中英文"; + final String str = "这是This一段中英文"; String ret = StrUtil.truncateUtf8(str, 12); Assert.assertEquals("这是Thi...", ret); @@ -666,26 +666,10 @@ public class StrUtilTest { Assert.assertEquals(str, ret); } - @Test - public void truncateGb18030Test() { - String str = "这是This一段中英文"; - String ret = StrUtil.truncateGb18030(str, 12); - Assert.assertEquals("这是This...", ret); - - ret = StrUtil.truncateGb18030(str, 13); - Assert.assertEquals("这是This一...", ret); - - ret = StrUtil.truncateGb18030(str, 14); - Assert.assertEquals("这是This一...", ret); - - ret = StrUtil.truncateGb18030(str, 999); - Assert.assertEquals(str, ret); - } - @Test public void truncateByByteLengthTest() { - String str = "This is English"; - String ret = StrUtil.truncateByByteLength(str, StandardCharsets.ISO_8859_1,10, 1, false); + final String str = "This is English"; + final String ret = StrUtil.truncateByByteLength(str, StandardCharsets.ISO_8859_1,10, 1, false); Assert.assertEquals("This is En", ret); } }