Java截取指定字节长度的字符串

        在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar2(10),即10个字节的长度,此时应该在JAVA甚至JS层面校验其对应数据的字节长度是否小于10,如果超过10,应截取为10个甚至9个字节长度(第10、第11个字节正好是一个占两字节的字符的情况)。 

package com.bijian.study.string;

import java.io.UnsupportedEncodingException;

/**
 * Java截取指定字节长度的字符串
 * 
 * 在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制
 * 如数据库定义的长度是varchar2(10),即10个字节的长度,此时应该在JAVA甚至JS层面校验其对应数据的字节长度是否小于10,如果超过10,应截取为10个甚至9个字节长度(第10、第11个字节正好是一个占两字节的字符的情况)
 */
public class StringTest01 {

	public static void main(String [] args) {
		
		String pContent = "1大家都清清楚楚了";
		int pLen = 10;
		String resultStr = stingLenProcessNok(pContent, pLen);
		System.out.println(resultStr);
		resultStr = stingLenProcessOk(pContent, pLen);
		System.out.println(resultStr);
	}
	
	/**
	 * 截取时未考虑第pLen、第pLen+1个字节为一个占两字节的字符的情况
	 * @param pContent
	 * @param pLen
	 * @return
	 */
	private static String stingLenProcessNok(String pContent, int pLen) {
		//由于JAVA的String的length是判断字符的个数,但后台数据库是根据指定编码(如GBK)保存数据的,所以JAVA的字符长度判断需根据字节判断
		if(pContent != null) {
			try {
				byte[] bytes = pContent.getBytes("GBK");
			
				if(bytes.length > pLen) {
					int tempLen = new String(bytes, 0, pLen, "GBK").length();
					//根据tempLen长度截取原字符串
					pContent = pContent.substring(0, tempLen);
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return pContent;
	}
	
	/**
	 * 截取时考虑了第pLen、第pLen+1个字节为一个占两字节的字符的情况
	 * @param pContent
	 * @param pLen
	 * @return
	 */
	private static String stingLenProcessOk(String pContent, int pLen) {
		//由于JAVA的String的length是判断字符的个数,但后台数据库是根据指定编码(如GBK)保存数据的,所以JAVA的字符长度判断需根据字节判断
		if(pContent != null) {
			try {
				byte[] bytes = pContent.getBytes("GBK");
			
				if(bytes.length > pLen) {
					int tempLen = new String(bytes, 0, pLen, "GBK").length();
					//根据tempLen长度截取原字符串
					pContent = pContent.substring(0, tempLen);
					
					bytes = pContent.getBytes("GBK");
					//如果第totalLen、第totalLen+1个字节正好是一个汉字,String的substring方法会返回一个完整的汉字,导致长度为totalLen+1(超过totalLen),所以再次对pContent的长度进行字节判断与处理
					if(bytes.length > pLen) {
						pContent = pContent.substring(0, tempLen-1);
					}
				}
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return pContent;
	}
}

          运行结果:

1大家都清清
1大家都清
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值