最近在开发的过程中遇到的问题,接口要求传入参数在255个字节以内(GBK),但是入参是一个既有中文又有英文的字符串,所以需要按字节截取,翻了半天也没找到有现成的方法,于是选择了这样一种方法实现。
/**
* 按字节数截取字符串
*
* @param str 要截取的字符串
* @param totalLength 截取长度
* @return
*/
public static String substringByByte(String str,int totalLength){
//删掉字符串中所有的的空格回车等
String replaceBlank = str.replace(" ", "").replace("\r\n\t","");
char[] chars = replaceBlank.toCharArray();
StringBuffer sb = new StringBuffer();
int chLength=2;
int enLength=1;
//判断loopChar是否为中文
Pattern pc = Pattern.compile("[\u4e00-\u9fa5]");
Matcher mc;
//判断loopChar是否为中文标点
Pattern pp = Pattern.compile("[\uFF01]|[\uFF0C-\uFF0E]|[\uFF1A-\uFF1B]|[\uFF1F]|[\uFF08-\uFF09]|[\u3001-\u3002]|[\u3010-\u3011]|[\u201C-\u201D]|[\u2013-\u2014]|[\u2018-\u2019]|[\u2026]|[\u3008-\u300F]|[\u3014-\u3015]");
Matcher mp;
int length = 0;
for (char loopChar : chars) {
mc = pc.matcher(String.valueOf(loopChar));
mp = pp.matcher(String.valueOf(loopChar));
//如果为中文或中文标点占2字节,如果是英文字符或数字占1字节,总长度超过要截取的长度跳出循环
if ((mc.find() || mp.find()) && length + chLength < totalLength) {
sb.append(loopChar);
length += chLength;
} else if (length + enLength < totalLength) {
sb.append(loopChar);
length += enLength;
} else {
break;
}
}
return sb.toString();
}
只需要传入需要截取的字符串和目标长度即可。