在实际的项目中,我们后台的数据库是根据指定编码(如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大家都清