求截取带中文的字符串的java方法。
截取字符串的方法及用法:
1、subString(int start);//截取从小标为start位置开始到结尾的字符串;
2、subString(int start,int end);//截取从小标为start位置开始到小标为end-1的字符串
3、split(String s);//将根据s匹配,将字符串截成数组;
比如String str = ”aa,b,vc,java“
str.split(",")得到的就是数组{”aa“,”b“,”vc“,”java“}
String b = a.substring(0,1);
楼主你好,很高兴能回答你这个很有挑战性的问题,首先我谈谈我对上面9个例子的理解,即这个方法应该实现的功能:
这个方法与JDK String原有的方法substring是有区别的,在这个方法里,一个中文汉字相当于占2个英文字符的位置。而且根据方法传入的参数pStart和pEnd在返回相应的子字符串child
如果pstart刚好在某个汉字的前半部分,则child应包含该汉字,在后部分则不含。与之相对应的是pEnd如果在某个汉字的后半部分,则child应含该汉字,否则不包含,如果pStart超出pStr的长度(这里一个汉字长度算2),则返回空,其他性质和JDK的性质形同。
如果觉得我的理解不错,且看下面的代码:
public class Test{
public Test(){
String str="ABCDE";
String str2="ABC你D";
String str3="A你B好C吗勇DE";
System.out.println("1 str='ABCDE' start=1 end=5 结果:"+getSubString(str,1,5));
System.out.println("2 str='ABCDE' start=1 end=4 结果:"+getSubString(str,1,4));
System.out.println("3 str='ABCDE' start=2 end=4 结果:"+getSubString(str,2,4));
System.out.println("4 str='ABCDE' start=6 end=7 结果:"+getSubString(str,6,7));
System.out.println("5 str='ABCDE' start=5 end=5 结果:"+getSubString(str,5,5));
System.out.println("6 str2='ABC你D' start=1 end=3 结果:"+getSubString(str2,1,3));
System.out.println("7 str2='ABC你D' start=1 end=4 结果:"+getSubString(str2,1,4));
System.out.println("8 str2='ABC你D' start=1 end=5 结果:"+getSubString(str2,1,5));
System.out.println("9 str2='ABC你D' start=4 end=4 结果:"+getSubString(str2,4,4));
System.out.println("10 str3='A你B好C吗勇DE' start=9 end=10 结果:"+getSubString(str3,9,10));
}
public static void main(String args[]){
new Test();
}
public String getSubString(String str,int pstart,int pend){
String resu="";
int beg=0;
int end=0;
int count1=0;
char[] temp=new char[str.length()];
str.getChars(0,str.length(),temp,0);
boolean[] bol=new boolean[str.length()];
for(int i=0;i<temp.length;i++){
bol[i]=false;
if((int)temp[i]>255){//说明是中文
count1++;
bol[i]=true;
}
}
if(pstart>str.length()+count1){
resu=null;
}
if(pstart>pend){
resu=null;
}
if(pstart<1){
beg=0;
}else{
beg=pstart-1;
}
if(pend>str.length()+count1){
end=str.length()+count1;
}else{
end=pend;//在substring的末尾一样
}
//下面开始求应该返回的字符串
if(resu!=null){
if(beg==end){
int count=0;
if(beg==0){
if(bol[0]==true)
resu=null;
else
resu=new String(temp,0,1);
}else{
int len=beg;//zheli
for(int y=0;y<len;y++){//表示他前面是否有中文,不管自己
if(bol[y]==true)
count++;
len--;//想明白为什么len--
}
//for循环运行完毕后,len的值就代表在正常字符串中,目标beg的上一字符的索引值
if(count==0){//说明前面没有中文
if((int)temp[beg]>255)//说明自己是中文
resu=null;//返回空
else
resu=new String(temp,beg,1);
}else{//前面有中文,那么一个中文应与2个字符相对
if((int)temp[len+1]>255)//说明自己是中文
resu=null;//返回空
else
resu=new String(temp,len+1,1);
}
}
}else{//下面是正常情况下的比较
int temSt=beg;
int temEd=end-1;//这里减掉一
for(int i=0;i<temSt;i++){
if(bol[i]==true)
temSt--;
}//循环完毕后temSt表示前字符的正常索引
for(int j=0;j<temEd;j++){
if(bol[j]==true)
temEd--;
}//循环完毕后temEd-1表示最后字符的正常索引
if(bol[temSt]==true)//说明是字符,说明索引本身是汉字的后半部分,那么应该是不能取的
{
int cont=0;
for(int i=0;i<=temSt;i++){
cont++;
if(bol[i]==true)
cont++;
}
if(pstart==cont)//是偶数不应包含,如果pstart<cont则要包含
temSt++;//从下一位开始
}
if(bol[temEd]==true){//因为temEd表示substring 的最面参数,此处是一个汉字,下面要确定是否应该含这个汉字
int cont=0;
for(int i=0;i<=temEd;i++){
cont++;
if(bol[i]==true)
cont++;
}
if(pend<cont)//是汉字的前半部分不应包含
temEd--;//所以只取到前一个
}
if(temSt==temEd){
resu=new String(temp,temSt,1);
}else if(temSt>temEd){
resu=null;
}else{
resu=str.substring(temSt,temEd+1);
}
}
}
return resu;//返回结果
}
}
测试结果如图,并且可以任意修改字符串,保证结果正确。
That's all !
一种做法是根据字节数判断是否为中文,因为英文字符占用一个字节,而汉字占用两个字节,示例如下:
public static boolean isChineseChar(char c)
throws UnsupportedEncodingException {
// 如果字节数大于1,是汉字
return String.valueOf(c).getBytes("UTF-8").length > 1;
}
你是说用subString这个函数得不到结果吗?如果是这样的话,不知你里面的参数是如何定义的,就拿①为例,如果你想输出全部,那应该这样定义subString(0,5)第一个参数指的是从第几位开始输出(不包括开始位),第二个参数指的是到哪一位结束为止(包括结束为),但结束位的计算方式是从头开始算起到你定义的结束位所经过的长度。另外如果你是想从某一位开始输出剩下的全部内容,那就只需给出从哪一位开始就可以了没必要给出结束位。
JDK中,String类型有自带的截取字符串的方法,如果你想看源代码可以下个,也有帮助文档,建议你看下帮助文档。
String substring(int beginIndex)
返回一个新的字符串,它是此字符串的一个子字符串。
String substring(int beginIndex, int endIndex)
返回一个新字符串,它是此字符串的一个子字符串。
这个是String的自动的两个方法
public static String getSubstring(String pStr,int pStart,int pEnd){
byte[] b=pStr.getBytes();
pStr="";
for(int i=pStart-1,point=pStart-1;i<pEnd;){
if(i>=b.length)break;
if(i==pEnd-1&&b[i]<0){
int length=i-point+1;
if(length%2==1)length--;
pStr+=new String(b,point,length);
}
i++;
if(b[i]<0){
continue;
}
else{
pStr+=new String(b,point,i-point);
point=i;
}
}
return pStr;
}
楼主,用你的数据测试了没问题,你自己拿去试试看,有问题我们再讨论,祝楼主成功
php字符串的截取
1楼的代码有点问题 截取中文会出现问题 比如刚好是9个字母1个汉字 你截取10位的话 就会出现乱码 所以截取含中文字符串时要用mb_substr代替substr for($i=0;$i<strlen($str);$i=$i+10){ string=mb_substr($str,$i,10);echo $string."";} ...
excel怎么由A列数据得到B列,就是截取字符串中的中文。
假如是处理的在A1:=MID(A1,FIND("=",A1)+1,FIND("&",A1)-FIND("=",A1)-1)
php关于截取中文字符串的问题
解决方法:选择'utf8'或者'gb2312',这样客户浏览器会自动选择并出现正确的中文显示。注意:'utf8'或者'gb2312'都可以正确显示中文的。2.数据库mysql中的编码类型不正确。解决方法:创建数据库的时候,mysql 字符集选择'utf8',mysql 连接校对选择utf8_general_ci,这样创建的数据库用来存储中文肯定没...
php截取一段字符串中第一个出现的数字或字母或冒号前面的中文汉字的语...
string= preg_replace('\/([a-z0-9\\:])+\/','',$string1);这样就把数字 字母 冒号后面的字符串去掉了
请教oracle 按指定的中文字符截取问题
用到两个函数,substr和instr,substr(expr,a,b) expr是字符串,a和b是数字,它表示在expr里从a位置取b个字符串 如substr('abcdef;g',2,3)就会取出bcd来 instr(expr1,expr2,a) 从expr1里找expr2第a次bm现的位置 如instr('abababab','ab',2) ab在串里第二次出现是在第3个位置,...
oracle中怎样截取固定中文宽度的字符。 如字符串“234f你好”,截取3...
declare a varchar;--定义一个变量,这里定义成varchar而不varchar2 b varchar;i number;begin a:='234f你好';b:='十分无法过问过';i:=3;dbms_output.put_line(substr(a,1,2*i));dbms_output.put_line(substr(b,1,2*i));end;这样试试 ...
请问,如何截断数据库中文字符串(超过长度加...省略)
标题的问题可以不是截断而是只需截取一部分显示。if len(text)>20 then text=left(text,20)&"..."end if 颜色代码应该都是长度相同的吧,这样你可以前截一段后截一段的办法解决啊
;名称(中文) 包含 '%大四%' ---》字符串截取 变成 名称(中文) 包含...
如果你只是想去掉开头的分号, 可以用 text = text.SubString(1); \/\/取从text第2个字符开始的所有字符 String.SubString()方法还可以截取字符串中的一段指定长度的字符串. 用法是:text = text.SubString(开始位置,长度); \/\/开始位置从0记 ---另--- 有关字符串的操作是各语言都不会缺少的,刚...
怎么用CString 的Find查找中文字符串,并截取
CString 还有 Left(),Mid(),Right()这几个函数哦 比如说想取“中”前面的,就可以 CString temp=str.Left(n)就好了~
js从字符串中截取中文和标点
var content = '\\t电子商务如火如荼地发展,如何助力于国民经济?在“互联网+”的发展背景下,传统产业如何“借力”?传统产业+电商,如何实现1+1大于2?<\\\/p>\\t日前,四川省政府办公厅下发四川省电子商务发展三年(2015—2017年)行动计划(以下简称《计划》),明确提出,到2017年,全省电子商务...
勤霞喉舒: public static void main(String args[]) {String str="看看以下回答是否解决了您的疑问" ; //提取子字符串,头一个表示开头的索引(包括),后一个表示结束的索引(不包括) //索引是在字符串的位置,从0开始 //str.substring(0, 7)表示从第0位到第6位(因为不包含第七位) //英文字符串也是类似的 String substr = str.substring(0, 7) ; System.out.println(substr); }
德清县13387575057: java怎么把字符串中的的汉字取出来 - ?
勤霞喉舒: 1.判断字符串是否全是汉字. String str1 = "java判断是否为汉字" String str2 = "全为汉字" String reg = "[\\u4e00-\\u9fa5]+" boolean result1 = str1.matches(reg)//false boolean result2 = str2.matches(reg)//true 2.提取字符串中的汉字. String ...
德清县13387575057: 【Java】编写一个截取字符串的方法 - ?
勤霞喉舒: 给你个我目前用的字符串工具类 /** * str:预处理字符串 * byteLength:截取的长度以字符为单位,1汉字、全角标点为2字符 * isFillNeeded:长度不足是否用空格补齐 * */ public static String truncateString(String str, int byteLength, boolean ...
德清县13387575057: java如何获取字符串中的中文 - ?
勤霞喉舒: 用substring方法取得中文字段、然后用append和原来字符串拼接.就这么简单
德清县13387575057: java 如何获取两个字符串之间的汉字 - ?
勤霞喉舒: import java.util.regex.Matcher; import java.util.regex.Pattern; public class Test3 { public static void main(String[] args) { String str = "321AAawdawdawd萨芬AAkjjkjBB"; String regex = "AA(.*)BB"; Pattern pattern = Pattern.compile(regex); ...
德清县13387575057: JAVA编程:编写一个截取字符串的函数 - ?
勤霞喉舒: 1、Java中,截取字符串函数为subString();2、使用方法:String name = "zhangsanlisiwangwu".subString(0, 3);3、即可输出从0到第3个的整串字符串
德清县13387575057: JAVA编写一个截取字符串的函数 - ?
勤霞喉舒: /** * 输入一个字符串和字节数,输出为按字节截取的字条符串,但要保证汉字不被截半 * @author Administrator * */ public class Ceshi { public static void main(String[] args) { String str = "sfsfs中国sdfsdfsfd"; System.out.println(substring(str, 10)); ...
德清县13387575057: java中如何截取字符串? - ?
勤霞喉舒: 截取字符串的方法及用法:1、subString(int start);//截取从小标为start位置开始到结尾的字符串; 2、subString(int start,int end);//截取从小标为start位置开始到小标为end-1的字符串 3、split(String s);//将根据s匹配,将字符串截成数组; 比如String str = ”aa,b,vc,java“ str.split(",")得到的就是数组{”aa“,”b“,”vc“,”java“}
德清县13387575057: JAVA中:中英文混合的字符串按字节截取问题 - ?
勤霞喉舒: 字符串有截取方法呀.....字符长度受你内存大小的影响~~~String str="abc...";这样定义的字符串是存在字符串池中的String str=new String("abc...")这样定义的字符串是在堆内存中的,然后 被栈内存的对象str引用 所以字符串是对...
德清县13387575057: 给出字符串,其中可能包含中文,需要截取某一段字符串,就是要小心中文. - ?
勤霞喉舒: 按照字节截取.比如字符串“我ABC是DEF”,要截取的话,用字节数来截取就不会有问题了.这是我看见你的提问最直观的回答,如果需要详细回答,希望你可以补充说明下具体的情况.