java多字节字符串按字节截取

简介: 算法思路1.先按照实际要截取的字节长度,复制一份字节数组2.转换回字符串,计算字符长度resLen,并按这个长度截取原字符串3.计算截取的字符串的字节数是否等于需求长度len,相等则直接返回,不相等,则在resLen的基础上减1再截取,则为需要的结果此算法截取的结果为向前截取,即保证最终截取的字节长度不能超过需求长度len,比如gbk字符集,"一二三四五",截取3字节,结果应为"一",实际长度为2字节,第3个字节为半个中文,属于无效字符,需要去掉。

算法思路

1.先按照实际要截取的字节长度,复制一份字节数组

2.转换回字符串,计算字符长度resLen,并按这个长度截取原字符串

3.计算截取的字符串的字节数是否等于需求长度len,相等则直接返回,不相等,则在resLen的基础上减1再截取,则为需要的结果

此算法截取的结果为向前截取,即保证最终截取的字节长度不能超过需求长度len,比如gbk字符集,"一二三四五",截取3字节,结果应为"一",实际长度为2字节,第3个字节为半个中文,属于无效字符,需要去掉。

在转换字节数组时,需要指定字符集,在不同的字符集下,转换出来的字节数组长度是不一样的。

经测试,效率要高于按循环的算法,尤其在截取长度较大时,性能较优

代码

public static String substr(String str, int len, 

                                String cs) throws UnsupportedEncodingException {

        byte[] br = new byte[len];

        byte[] bt = str.getBytes(cs);

        System.arraycopy(bt, 0, br, 0, len);

        String res = new String(br, cs);

        int resLen = res.length();

        if (str.substring(0, resLen).getBytes(cs).length > len) {

            res = str.substring(0, resLen - 1);

        }

        return res;

    }
目录
相关文章
|
4天前
|
Java 索引
String字符串常用函数以及示例 JAVA基础
String字符串常用函数以及示例 JAVA基础
|
5天前
|
Java
Java获取字符串最后一位
【5月更文挑战第9天】Java获取字符串最后一位
38 5
|
3天前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
|
4天前
|
Java
Java中两个字符串进行大小比较
Java中两个字符串进行大小比较
19 5
|
5天前
|
消息中间件 安全 前端开发
字节面试:说说Java中的锁机制?
Java 中的锁(Locking)机制主要是为了解决多线程环境下,对共享资源并发访问时的同步和互斥控制,以确保共享资源的安全访问。 锁的作用主要体现在以下几个方面: 1. **互斥访问**:确保在任何时刻,只有一个线程能够访问特定的资源或执行特定的代码段。这防止了多个线程同时修改同一资源导致的数据不一致问题。 2. **内存可见性**:通过锁的获取和释放,可以确保在锁保护的代码块中对共享变量的修改对其他线程可见。这是因为 Java 内存模型(JMM)规定,对锁的释放会把修改过的共享变量从线程的工作内存刷新到主内存中,而获取锁时会从主内存中读取最新的共享变量值。 3. **保证原子性**:锁
20 1
|
5天前
|
存储 Java 索引
【JAVA基础篇教学】第十一篇:Java中字符串操作详解
【JAVA基础篇教学】第十一篇:Java中字符串操作详解
|
5天前
|
Java
代码实例演示Java字符串与输入流互转
代码实例演示Java字符串与输入流互转
|
5天前
|
传感器 数据采集 网络协议
Java串口通信:从十六进制字符串到字节数组的正确转换与发送
Java串口通信:从十六进制字符串到字节数组的正确转换与发送
32 4
|
5天前
|
Java
在Java中,如何将字符串转换为浮点数?
【4月更文挑战第30天】在Java中,如何将字符串转换为浮点数?
17 0
|
5天前
|
存储 Java C语言
【Java探索之旅】数据类型与变量 浮点型,字符型,布尔型,字符串型
【Java探索之旅】数据类型与变量 浮点型,字符型,布尔型,字符串型
20 0