A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© haozi050 中级黑马   /  2014-2-15 20:28  /  1356 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 haozi050 于 2014-2-15 20:30 编辑

老毕在基础视频中说所有中文在GB2312编码中两个字节开头都是1,表是负数,所以中文对应的字节都是负数。GBK中是了1负1正。使用系统默认的字符串解码方式应该是GBK编码,得到的应该是一个中文的两个字节都是负数(即字节都是1开头),那为什么下面代码的结果中出现有的中文两个字节是11正,有的是两个负的?请高手指点!
  1. package day22;
  2. /**需求:对指定字符串进行指定字节数截取,不能出现半个中文
  3. * 思路:对字符串进行字节数截取,首先需要将字符串编码成字节,这里没指定,就是用字符串默认的GBK编码。截取完之后,将字节解码成字符串
  4. *默认使用的也是GBK。在GBK编码中,中文两个字节是1正1负。转换成字节数组后,遍历数组,从最后要截取的位置开始遍历,遇到正数就停止。
  5. *因为只有最后的截取位比较特殊,如果碰到正数的话,那前面一定是完整的中文。定义变量记录住负数个数,如果是2的倍数则包含,否则舍弃。
  6. *,
  7. * */
  8. public class Substring {

  9.         public static void main(String[] args) {
  10.                 //定义字符串
  11.                 String str="abc你好谢谢de琲f琲";
  12.                 //获取所有字节
  13.                 byte[]b=str.getBytes();
  14.                 for(byte y:b)
  15.                 {
  16.                         System.out.println(y);
  17.                 }
  18.                 //定义要截取的字节个数
  19. //                int num=6;
  20.                 for(int i=0;i<str.getBytes().length;i++)
  21.                 {
  22.                         String d=getSubstring(str,i+1);
  23.                         System.out.println("截取的字符是:"+d);
  24.                 }
  25.         }

  26.         private static String getSubstring(String str, int num) {
  27.                 //获取字节数组
  28.                 byte[]b=str.getBytes();
  29. //                定义计数器
  30.                 int count=0;
  31.                 //遍历字节数组
  32.                 for(int i=num-1;i>=0;i--)
  33.                 {
  34.                         if(b[i]<0)
  35.                                 count++;
  36.                         else
  37.                                 break;
  38.                 }
  39.                 if(count%2==0)
  40.                 return new String(b,0,num);
  41.                 else
  42.                         return new String(b,0,num-1);
  43.         }

  44. }
复制代码
运行结果如下:
  1. 97
  2. 98
  3. 99
  4. -60
  5. -29
  6. -70
  7. -61
  8. -48
  9. -69
  10. -48
  11. -69
  12. 100
  13. 101
  14. -84
  15. 105
  16. 102
  17. -84
  18. 105
  19. 截取的字符是:a
  20. 截取的字符是:ab
  21. 截取的字符是:abc
  22. 截取的字符是:abc
  23. 截取的字符是:abc你
  24. 截取的字符是:abc你
  25. 截取的字符是:abc你好
  26. 截取的字符是:abc你好
  27. 截取的字符是:abc你好谢
  28. 截取的字符是:abc你好谢
  29. 截取的字符是:abc你好谢谢
  30. 截取的字符是:abc你好谢谢d
  31. 截取的字符是:abc你好谢谢de
  32. 截取的字符是:abc你好谢谢de
  33. 截取的字符是:abc你好谢谢de琲
  34. 截取的字符是:abc你好谢谢de琲f
  35. 截取的字符是:abc你好谢谢de琲f
  36. 截取的字符是:abc你好谢谢de琲f琲
复制代码



评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 很给力!

查看全部评分

1 个回复

倒序浏览
GBK编码方式中,汉字并不是所有的编码都是由两个负数组成,存在一正一负的编码情况,视频里有讲

评分

参与人数 1技术分 +1 收起 理由
ily521125 + 1 赞一个!

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马