本帖最后由 haozi050 于 2014-2-15 20:30 编辑
老毕在基础视频中说所有中文在GB2312编码中两个字节开头都是1,表是负数,所以中文对应的字节都是负数。GBK中是了1负1正。使用系统默认的字符串解码方式应该是GBK编码,得到的应该是一个中文的两个字节都是负数(即字节都是1开头),那为什么下面代码的结果中出现有的中文两个字节是1负1正,有的是两个负的?请高手指点! - package day22;
- /**需求:对指定字符串进行指定字节数截取,不能出现半个中文
- * 思路:对字符串进行字节数截取,首先需要将字符串编码成字节,这里没指定,就是用字符串默认的GBK编码。截取完之后,将字节解码成字符串
- *默认使用的也是GBK。在GBK编码中,中文两个字节是1正1负。转换成字节数组后,遍历数组,从最后要截取的位置开始遍历,遇到正数就停止。
- *因为只有最后的截取位比较特殊,如果碰到正数的话,那前面一定是完整的中文。定义变量记录住负数个数,如果是2的倍数则包含,否则舍弃。
- *,
- * */
- public class Substring {
- public static void main(String[] args) {
- //定义字符串
- String str="abc你好谢谢de琲f琲";
- //获取所有字节
- byte[]b=str.getBytes();
- for(byte y:b)
- {
- System.out.println(y);
- }
- //定义要截取的字节个数
- // int num=6;
- for(int i=0;i<str.getBytes().length;i++)
- {
- String d=getSubstring(str,i+1);
- System.out.println("截取的字符是:"+d);
- }
- }
- private static String getSubstring(String str, int num) {
- //获取字节数组
- byte[]b=str.getBytes();
- // 定义计数器
- int count=0;
- //遍历字节数组
- for(int i=num-1;i>=0;i--)
- {
- if(b[i]<0)
- count++;
- else
- break;
- }
- if(count%2==0)
- return new String(b,0,num);
- else
- return new String(b,0,num-1);
- }
- }
复制代码 运行结果如下:
- 97
- 98
- 99
- -60
- -29
- -70
- -61
- -48
- -69
- -48
- -69
- 100
- 101
- -84
- 105
- 102
- -84
- 105
- 截取的字符是:a
- 截取的字符是:ab
- 截取的字符是:abc
- 截取的字符是:abc
- 截取的字符是:abc你
- 截取的字符是:abc你
- 截取的字符是:abc你好
- 截取的字符是:abc你好
- 截取的字符是:abc你好谢
- 截取的字符是:abc你好谢
- 截取的字符是:abc你好谢谢
- 截取的字符是:abc你好谢谢d
- 截取的字符是:abc你好谢谢de
- 截取的字符是:abc你好谢谢de
- 截取的字符是:abc你好谢谢de琲
- 截取的字符是:abc你好谢谢de琲f
- 截取的字符是:abc你好谢谢de琲f
- 截取的字符是:abc你好谢谢de琲f琲
复制代码
|