黑马程序员技术交流社区

标题: 关于截取字符串的一个问题,大家应该都见过 [打印本页]

作者: 紫衣侯    时间: 2013-5-28 17:49
标题: 关于截取字符串的一个问题,大家应该都见过
本帖最后由 紫衣侯 于 2013-5-31 18:30 编辑

编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串但是要保证汉字不被截半个。
这个题大家应该都见过做过,不过我有一个做法不知道对不对,请计算机基础好的同学看看。
public static void main(String[] args) {
                sub("我减师hde肥sfsa", 5);
        }

        public static void sub(String str, int k) {
         byte[] by = str.getBytes();
         byte[] bb = new byte[k+1];
         if(by[k+1]>0){
                 for(int i = 0;i<k;i++){
                         bb=by;
                 }
         }else{
                 for(int i = 0;i<k+1;i++){
                         bb=by;
                 }
         }
         String result = new String(bb);
         System.out.println(result);
        }
}
这是简单实现的代码,因为我发现通过getbyte()方法获取byte数组后,由于一个汉字占两个字节,如果打印出数组会发现,如果是汉字就会是两个负数,其它则是一个正数,这就是我的一个想法,不过不知道对不对,这到底只是表象还是真理?

作者: FantasticPie    时间: 2013-5-28 18:00
本帖最后由 FantasticPie 于 2013-5-28 18:19 编辑

你的想法是正确的,比如:
byte[] by = "我".getBytes();
for(int i=0; i<by.length; i++){
    System.out.print(by【i】 + "\t");
}
打印的结果就是-50 -46,由此可见一个汉字确实被读作了两个负数。

所以说这样的做法来截取字符串的方法是错误的。

但是打印:System.out.print((int)'我');结果是25105。

所以解决的办法就是把字符串改为字符数组,就能解决读取汉字的问题。

作者: 画饼    时间: 2013-5-28 18:02
你上面那个代码运行起来还是会打出乱码啊,如果是汉字就会是两个负数,其它则是一个正数,这就是我的一个想法,不过不知道对不对,这到底只是表象还是真理?

还有这句话,我没能理解,抱歉楼主

作者: FantasticPie    时间: 2013-5-28 18:05
画饼 发表于 2013-5-28 18:02
你上面那个代码运行起来还是会打出乱码啊,如果是汉字就会是两个负数,其它则是一个正数,这就是我的一个想 ...

我运行就不会乱码。“如果是汉字就会是两个负数,其它则是一个正数,这就是我的一个想法,不过不知道对不对,这到底只是表象还是真理?”这就话的意思就是通过getBytes()来获取中文的字符串的字节数组的时候,每个中文读取的结果是两个负数。我上面的回答说明了这个问题。
作者: FantasticPie    时间: 2013-5-28 18:08
本帖最后由 FantasticPie 于 2013-5-28 18:10 编辑
FantasticPie 发表于 2013-5-28 18:00
你的想法是正确的,比如:
byte[] by = "我".getBytes();
for(int i=0; i

上面的代码有点错误:

byte[] by = "我".getBytes();
for(int i=0; i<by.length; i++){
    System.out.print(by + "\t");//这里应该是by【i】
}

作者: 紫衣侯    时间: 2013-5-28 18:30
FantasticPie 发表于 2013-5-28 18:00
你的想法是正确的,比如:
byte[] by = "我".getBytes();
for(int i=0; i

感觉前言不搭后语啊,怎么所以是错的。。。   后面的不是字节吧,char 类型底层本来就是数字组成的,可以和int 互转
作者: 紫衣侯    时间: 2013-5-28 18:33
画饼 发表于 2013-5-28 18:02
你上面那个代码运行起来还是会打出乱码啊,如果是汉字就会是两个负数,其它则是一个正数,这就是我的一个想 ...

意思就是“汉字转成字节后是负数”这只是一部分的现象还是全部? 不知道底层是什么样的
作者: FantasticPie    时间: 2013-5-28 18:36
紫衣侯 发表于 2013-5-28 18:33
意思就是“汉字转成字节后是负数”这只是一部分的现象还是全部? 不知道底层是什么样的 ...

这个以我现在的积累只知道getBytes()是这样的




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2