字符串截取及中文处理方法

 /**
	 * 从原字符串根据最大字节长度以及需要保留的字节长度,获取子字符串,“最大字节长度”用于判断原字符串字节长度是否超过该长度,如果超过则截取“需要保留的字节长度”子串并补充“...”返回,如果未超过,则直接返回原字符串;<br>
	 * 这里考虑到其中有中文的情况,如果最后一个字节为中文的一半,则去掉该字节,显示字节长度为“需截字节长度-1”;<br>
	 * 如果输入需要截取的字节长度超过了当前传入字符串的字节长度,则返回全部字符串,不报异常;<br>
	 * 如果需要截取的字节长度小于当前字符串的长度,则在考虑中文情况下截取指定的字符串,并补充“...”返回。<br>
     * @param str					原字符串
     * @param maxBytesLength		最大字节长度(如果原字符串的字节长度超过该长度,就需要做字符截取处理,否则直接返回原字符串)		
     * @param keepBytesLength		需要保留的字节长度
     * @param needMore				是否需要补充"..."
     * @return
     * @throws UnsupportedEncodingException
     */
    public static String subString(String str, int maxBytesLength,int keepBytesLength, boolean needMore) {
		int chineseByteNum = 0;
		byte bt[] = null;
		try {
			bt = str.getBytes(CHARSET_GBK);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(bt.length<=maxBytesLength) return str;
		for (int i = 0; i < keepBytesLength; i++) {
			if (bt[i] < 0) {//中文
				chineseByteNum++;
			}
		}

		if (!(chineseByteNum % 2 == 0)) {//在截取的范围内中文刚好截取完,不存在半个中文的情况
			keepBytesLength--;
		}

		StringBuffer substrx=new StringBuffer("");
		try {
			substrx = substrx.append(new String(bt, 0, keepBytesLength,CHARSET_GBK));
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		if(needMore){
			substrx.append("...");
		}
		return substrx.toString();

	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值