substring截取中文字符的问题

时间:2022-07-13 08:12:21

调用String的substring函数截取中文字符时,它把一个汉字当作一个字符来截取了,如下例:

public class TestSubString{
public static void main(String[] args){
String str = "abc我要学英语!";
str = str.substring(0,5);
System.out.println(str);
}
}

输出结果为"abc我要";
如果我想把一个汉字当成两个字符来截取,即,我想取得的结果为"abc我",我要怎么处理?

15 个解决方案

#1


你这样截是没有道理的,一个汉字就是一个字符
另外一个汉字是两个字节,你硬要按字节来截的话,会截出半个汉字来,到时候可能会乱码的,
不知道你为什么会有这么奇怪的想法,肯定是你的做法有问题
应该可以通过其它途径来解决你的问题的

#2


mark

#3


to:wizardblue(不死鱼) 
做法没有问题,因为我的数据库字段类型为varchar(5);
而用substring(0,5)截取的字符串"abc我要"在数据库中占的是7个字符
所以我想按字节来截取,即使会碰到乱码,我想应该有办法解决的吧?

#4


varchar(5)又不是说只能是5个字符
varchar是可变长度

#5


还有我刚才去mysql下面试了
create table sstring (
  name varchar(5));

insert into sstring(name)
values('一二三四五');

select * from sstring的结果是"一二三四五"
没有问题

#6


要截也是数据库自己会截的,不需要自己截

#7


fff

#8


刚做的系统,晚会搞好了赏试着自己做一下,昨天才注册的,大家多多照顾!

#9


我用的是sqlserver:
insert into ssdInfoAgreementList(OperateTime,OperateUse,FeeTelNo,RecTelNum,RecTelNo,InfoCode,TailorMode,BeginTime,EndTime,TaskFrom,FeeType,Exp1) values('20060327103826','1','2323',1,'RecTelNo','最高温度:33度,最低温',2,'20060327103826','20060327103826',9,1,'')
这个语句有错误

将‘最高温度:33度,最低温’换成'最高温度:33'它就正常了

另infoCode字段是char(12)(真不知道数据库设计人员怎会还用char类型)

#10


感觉楼主概念有点混乱,你个汉字就是一个字符 ,字母在这里也是一个字符 
String str = "abc我要学英语!";
str = str.substring(0,4);  不就行了

#11


to:kingofworl(良辰美景虚度)
str是变量,如果str="我要学英语",那str.substring(0,4)="我要学英",写到char(5)的字段中还是会报错

#12


这样就有点离谱了,那只好硬截了
public static String substring(String s,int num){
int count=0;
StringBuffer res = new StringBuffer();
for(int i=0;i<s.length();i++){
int j = s.charAt(i);
if((j&0xff00>>>8)!=0)count++;
if(count<=num)res.append((char)j);
else break;
}
return res.toString() ;
}

#13


java中的String是unicode类型的的 汉字占用一个字节 和c中的char[]是不一样的
可以考虑byte[]类型进行处理 不过代码操作就不如String方便 但是效率是一样的

#14


按照字节来取

public class MainAssist {
    public static void main(String[] args) {
        String str = "abc我要学英语!";
        byte[] substr= new byte[5];
        System.arraycopy(str.getBytes(), 0, substr, 0, 5);
        str = new String (substr);
        System.out.println(str);
    }
}

#15


在JAVA里采用的是Unicode 编码,中文 英文字符都是占两个字节,所以中英文字符都算一个

#1


你这样截是没有道理的,一个汉字就是一个字符
另外一个汉字是两个字节,你硬要按字节来截的话,会截出半个汉字来,到时候可能会乱码的,
不知道你为什么会有这么奇怪的想法,肯定是你的做法有问题
应该可以通过其它途径来解决你的问题的

#2


mark

#3


to:wizardblue(不死鱼) 
做法没有问题,因为我的数据库字段类型为varchar(5);
而用substring(0,5)截取的字符串"abc我要"在数据库中占的是7个字符
所以我想按字节来截取,即使会碰到乱码,我想应该有办法解决的吧?

#4


varchar(5)又不是说只能是5个字符
varchar是可变长度

#5


还有我刚才去mysql下面试了
create table sstring (
  name varchar(5));

insert into sstring(name)
values('一二三四五');

select * from sstring的结果是"一二三四五"
没有问题

#6


要截也是数据库自己会截的,不需要自己截

#7


fff

#8


刚做的系统,晚会搞好了赏试着自己做一下,昨天才注册的,大家多多照顾!

#9


我用的是sqlserver:
insert into ssdInfoAgreementList(OperateTime,OperateUse,FeeTelNo,RecTelNum,RecTelNo,InfoCode,TailorMode,BeginTime,EndTime,TaskFrom,FeeType,Exp1) values('20060327103826','1','2323',1,'RecTelNo','最高温度:33度,最低温',2,'20060327103826','20060327103826',9,1,'')
这个语句有错误

将‘最高温度:33度,最低温’换成'最高温度:33'它就正常了

另infoCode字段是char(12)(真不知道数据库设计人员怎会还用char类型)

#10


感觉楼主概念有点混乱,你个汉字就是一个字符 ,字母在这里也是一个字符 
String str = "abc我要学英语!";
str = str.substring(0,4);  不就行了

#11


to:kingofworl(良辰美景虚度)
str是变量,如果str="我要学英语",那str.substring(0,4)="我要学英",写到char(5)的字段中还是会报错

#12


这样就有点离谱了,那只好硬截了
public static String substring(String s,int num){
int count=0;
StringBuffer res = new StringBuffer();
for(int i=0;i<s.length();i++){
int j = s.charAt(i);
if((j&0xff00>>>8)!=0)count++;
if(count<=num)res.append((char)j);
else break;
}
return res.toString() ;
}

#13


java中的String是unicode类型的的 汉字占用一个字节 和c中的char[]是不一样的
可以考虑byte[]类型进行处理 不过代码操作就不如String方便 但是效率是一样的

#14


按照字节来取

public class MainAssist {
    public static void main(String[] args) {
        String str = "abc我要学英语!";
        byte[] substr= new byte[5];
        System.arraycopy(str.getBytes(), 0, substr, 0, 5);
        str = new String (substr);
        System.out.println(str);
    }
}

#15


在JAVA里采用的是Unicode 编码,中文 英文字符都是占两个字节,所以中英文字符都算一个