package com.test.main;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 编写一个截取字符串的函数,输入为一个字符串和字节数,
 * 输出为按字节截取的字符串。 但是要保证汉字不被截半个,
 * 如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,
 * 应该输出为“我ABC”而不是“我ABC+汉的半个”。
 * 该题关键在于截的位置,如果知道位置我们便可以用subString(0,len)
 * 来截取了,根据题目按字节截,如果是中文就是两个字节,那我们可以从头开始算
 * 长度,一个中文算两个一个项文算一个,直到字节长度比他要求截的长度长为止。
 * @author jiangzhj
 *
 */
public class TestZH {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		TestZH test = new TestZH();
		//源字符串
		String str = "中dd文dsaf中男大3443n中国43中国人0ewldfls=103在夺"	;
		System.out.println(str.getBytes().length);
		for(int i =1 ;i <=str.getBytes().length;i++){
			String s = test.getSubLength(str,i);
			System.out.println("i:"+i+"substr="+s);
		}


	}
	/**
	 * 判断是否为中文
	 * 是返回true
	 * 这里根据正则表达式来判断,
	 * 这里会有很多不同方法来判断中文,
	 * 此方法来自网络
	 * 如果大家有其他方法可以替换
	 * @param str
	 * @return
	 */
	public boolean isZhChar(String str){
		boolean flag = false;
		String reg = "[\u4e00-\u9fa5]";
		Pattern p = Pattern.compile(reg);
		Matcher m = p.matcher(str);
		flag = m.find();
		return flag;
	}
	/**
	 * 计算字符串需要截取的长度
	 * 给了两个变量p1,p2,p1一个是记录字符串长度,此长度就是最后返回的
	 * p2是字节长度,把这个长度与给定的长度比较,当p2的长度>=给定长度时就
	 * 跳出循环
	 * @param str
	 * @param len
	 * @return
	 */
	private String getSubLength(String str,int len){
		if(str.getBytes().length==len){
			return str;
		}
		//字符串长度
		int p1=0;
		//字节长度
		int p2=0;
		while(p2<len){
			//一次截长度为一的字符串,判断是否为中文字符,如果是则字节长度+2
			if(isZhChar(str.substring(p1, p1+1))){
				p2+=2;
				//如果字节长度大于给定长度则跳出循环,
				if(p2>len){
					break;
				}
			}else{
				p2+=1;
			}
			++p1;
		}
		return str.substring(0,p1);
	}
}

此题是网上网友提供,我在这里贴贴我的代码,请各位多多指教

题目:编程:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

 运行结果

49
 i:1substr=
 i:2substr=中
 i:3substr=中d
 i:4substr=中dd
 i:5substr=中dd
 i:6substr=中dd文
 i:7substr=中dd文d
 i:8substr=中dd文ds
 i:9substr=中dd文dsa
 i:10substr=中dd文dsaf
 i:11substr=中dd文dsaf
 i:12substr=中dd文dsaf中
 i:13substr=中dd文dsaf中
 i:14substr=中dd文dsaf中男
 i:15substr=中dd文dsaf中男
 i:16substr=中dd文dsaf中男大
 i:17substr=中dd文dsaf中男大3
 i:18substr=中dd文dsaf中男大34
 i:19substr=中dd文dsaf中男大344
 i:20substr=中dd文dsaf中男大3443
 i:21substr=中dd文dsaf中男大3443n
 i:22substr=中dd文dsaf中男大3443n
 i:23substr=中dd文dsaf中男大3443n中
 i:24substr=中dd文dsaf中男大3443n中
 i:25substr=中dd文dsaf中男大3443n中国
 i:26substr=中dd文dsaf中男大3443n中国4
 i:27substr=中dd文dsaf中男大3443n中国43
 i:28substr=中dd文dsaf中男大3443n中国43
 i:29substr=中dd文dsaf中男大3443n中国43中
 i:30substr=中dd文dsaf中男大3443n中国43中
 i:31substr=中dd文dsaf中男大3443n中国43中国
 i:32substr=中dd文dsaf中男大3443n中国43中国
 i:33substr=中dd文dsaf中男大3443n中国43中国人
 i:34substr=中dd文dsaf中男大3443n中国43中国人0
 i:35substr=中dd文dsaf中男大3443n中国43中国人0e
 i:36substr=中dd文dsaf中男大3443n中国43中国人0ew
 i:37substr=中dd文dsaf中男大3443n中国43中国人0ewl
 i:38substr=中dd文dsaf中男大3443n中国43中国人0ewld
 i:39substr=中dd文dsaf中男大3443n中国43中国人0ewldf
 i:40substr=中dd文dsaf中男大3443n中国43中国人0ewldfl
 i:41substr=中dd文dsaf中男大3443n中国43中国人0ewldfls
 i:42substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=
 i:43substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=1
 i:44substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=10
 i:45substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103
 i:46substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103
 i:47substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在
 i:48substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在
 i:49substr=中dd文dsaf中男大3443n中国43中国人0ewldfls=103在夺



以上这种方法有点通俗,本人写完后总感觉不是太好。于是又写下以下这道。呆会再贴上来。