文档章节

根据字符数/Byte数切分字符串

j
 jdzyh
发布于 2017/02/28 09:13
字数 566
阅读 5
收藏 0
/**
     * 按照长度拆分字符串(若分段小于segment个,则填充""至数组),取实际段数与默认段数较大的作为返回的数量
     * @param srcString
     * @param seg_and_len [默认段数;每段长度;是否按byte划分], 默认为[20;3800;1];第三位默认为1,表示按照byte划分.
     * @return 
     */
    public static List<String> splitXmlString(String srcString, int... seg_and_len){
        List<String> retList = new ArrayList<String>();
        
        int _SEGMENT = 20;
        int _LEN = 3800;
        
        int default_segment = _SEGMENT;
        int field_len = _LEN;
        int isSplitByByte = 1;
        
        //检验每段长度的数值
        if(seg_and_len.length==0){
            default_segment = _SEGMENT;
            field_len = _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==1) {//仅有默认段数
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==2) {//有默认段数与每段长度
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = (seg_and_len[1]>0) ? seg_and_len[1] : _LEN;
            isSplitByByte = 1;
            
        }else if(seg_and_len.length==3) {//有默认段数、每段长度
            default_segment = (seg_and_len[0]>_SEGMENT) ? seg_and_len[0] : _SEGMENT;
            field_len = (seg_and_len[1]>0) ? seg_and_len[1] : _LEN;
            isSplitByByte = (seg_and_len[2]==0) ? seg_and_len[2] : 1;
            
        }
        
        //检验输入字符串
        if(null==srcString||srcString.equals("")){
            for(int i=0;i<default_segment;i++){ //当输入没有的时候,返回default_segment个空字符串对象
                retList.add(i,"");
            }
            return retList;
        }
        
        switch(isSplitByByte){
            case 0://按照字符数划分
                //实际应分段数
                int relSegment = (int) Math.ceil( (double)srcString.length()/field_len );

                //检验分段数
                int seg_limit = (default_segment > relSegment) ? default_segment:relSegment;
                
                for(int i=0;i<relSegment;i++){
                    if(i!=relSegment-1) {
                        retList.add( srcString.substring(i*field_len, i*field_len+field_len) );
                    }else{ //对实际分段的最后一段,填充剩下的所有字符串.
                        retList.add( srcString.substring(i*field_len, srcString.length()) );
                    }
                }
                //若分段小于seg_limit个,则填充""至数组
                for(int i=relSegment;i<seg_limit;i++){
                    retList.add(i,"");
                }
                break;
                
            case 1://按照byte数划分
                retList = subStringSplitByByte(srcString, field_len);
                int rel_size = (null==retList||retList.isEmpty())? 0 : retList.size();
                
                if(rel_size < default_segment) {
                    for(int i=rel_size;i<default_segment;i++){
                        retList.add(i,"");
                    }
                }
                
                break;
                
            default:
                break;
        }       
        
        
        return retList;
    }
    /**
     * 根据字节长度长度len, 分割字符串src,
     * @param src
     * @param byte_len
     * @return  由于中文的原因,返回的字符串数组,每组至多byte_len为字节.
     */
    public static List<String> subStringSplitByByte(String src ,int byte_len){
        List<String> retList = new ArrayList<String>();
        
        if(null==src||src.isEmpty()){
            return retList;
        }
        if(byte_len < 2) byte_len=src.length();
        
        try {
            byte[] bytes = src.getBytes("gbk");
            
            int hanzi_cnt = 0;
            int pos = 0;
            int l_s = 0;
            int r_s = 0;
              
            for(int i=0;i<bytes.length;i++){
                if(bytes[i]<0) {
                    hanzi_cnt++;
                    r_s += 1;
                }else {
                    r_s += 2;
                }
                
                if( (i+1-pos) % byte_len==0) {        
                    if(hanzi_cnt==0 || hanzi_cnt%2==0 ){
                        retList.add(src.substring(l_s/2, r_s/2 ));
                        pos = i+1;
                        hanzi_cnt = 0;
                        l_s = r_s;
                        continue;
                    
                    }else{ // hanzi_cnt%2==1
                        retList.add(src.substring(l_s/2, r_s/2));
                        pos = i;
                        hanzi_cnt = 1;
                        l_s = r_s;
                        continue;
                    }             
                }
                
            }
            if(l_s/2 < src.length()){
                retList.add(src.substring(l_s/2, src.length() ));
            }
            
            
        } catch (UnsupportedEncodingException e) {
            logger.error("", e);
        }
        
        
        return retList;
    }

 

© 著作权归作者所有

共有 人打赏支持
j
粉丝 0
博文 2
码字总数 891
作品 0
浦东
程序员
私信 提问
PHP中substr() mb_substr() mb_struct()的区别和用法及Smar...

PHP substr(),mbsubstr()及mbstrcut的区别和用法及Smarty模板中的truncate调节器浅谈 PHP substr() 函数可以 分割文字,但要分割的文字如果包括中文字符往往会遇到问题,这时可以用mbsubstr(...

sco
2012/10/07
0
0
从JDK源码看String(下)

lastIndexOf方法 该方法用于返回指定字符在此字符串中最后一次出现处的索引,有多种方法参数。可传入 int 类型,也可传入 String 类型,另外还能传入开始位置。根据编码的不同分别用 Latin1...

超人汪小建
08/13
0
0
解决分割中文时出乱码的方法 mb_substr() or mb_strcut

原因:字符编码的问题,GB2312中文占两个字符,utf-8中文占3个字符,分割的时候要看中文字符是否结束,否则久乱码 解决方法: PHP substr()函数可以 分割文字,但要分割的文字如果包括中文字...

kobe52099
2014/01/13
0
0
Java中byte与16进制字符串的互相转换

Java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和...

毛朱
2013/12/09
0
0
Java中byte与16进制字符串的互相转换

ava中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示(23 + 22 + 21 + 20 = 15),所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低...

zhangyujsj
2013/11/26
0
1

没有更多内容

加载失败,请刷新页面

加载更多

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
31分钟前
1
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
43分钟前
2
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
54分钟前
11
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
今天
5
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
今天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部