现在的位置: 首页 > 编程语言 > 正文

编写一个截取字符串的函数,(网上流传的答案有的是错的)输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4

2019年05月16日 编程语言 ⁄ 共 1131字 ⁄ 字号 评论关闭

java:

public class StringSplit {
	public static void main(String[] args) throws Exception {
		String ss = "a很bc你好";
		System.out.println(splitString(ss, 1));
	}

	public static String splitString(String str, int byteLength)
			throws Exception {
		//如果字符串为空,直接返回
		if(str == null || "".equals(str)) {
			return str;
		}
		//用于统计这个字符串中有几个中文字符
		int wordCount = 0;
		//统一按照gbk编码来得到他的字节数组,因为不同的编码字节数组是不一样的。
		byte[] strBytes = str.getBytes("GBK");
		
		//如果只截取一位,而且第一位是中文字符时的处理
		if (byteLength == 1) {
			if (strBytes[0] < 0) {
				return str.substring(0, 1);
			}
		}
		//字符串中的一个中文会使得wordCount 加两次
//如果你这个字节取出来的是一个汉字也就是两个字节当中的一个的话val的值为负数
		for (int i = 0; i < byteLength; i++) {
			int val = strBytes[i];
			if (val < 0) {
				wordCount++;
			}
		}
		
		//如果传递的这个截取的位数没有截到半个中文上面,那么就按照byteLength - (wordCount / 2个长度进行截取
		if (wordCount % 2 == 0) {
			return str.substring(0, (byteLength - (wordCount / 2)));
		}
		//否则,我们就舍弃多出来的这一位 所以  -1 
		return str.substring(0, (byteLength - (wordCount / 2) - 1));

	}
}

js


function isChinese(str){  //判断是不是中文
    var reCh=/[u00-uff]/;
    return !reCh.test(str);
}
function lenStat(target){
    var strlen=0; //初始定义长度为0
	var txtval = $.trim(target.val());
	for(var i=0;i<txtval.length;i++){
	 if(isChinese(txtval.charAt(i))==true){
	  strlen=strlen+2;//中文为2个字符
	 }else{
	  strlen=strlen+1;//英文一个字符
	 }
	}
	strlen=Math.ceil(strlen/2);//中英文相加除2取整数
	return strlen;
}

抱歉!评论已关闭.