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在夺
以上这种方法有点通俗,本人写完后总感觉不是太好。于是又写下以下这道。呆会再贴上来。