IO练习--按字节截取字符串

* 在Java中字符串“abcd”和字符串“ab你好”都是4个字符,
* 但是字节数不同,因为GBK中一个汉字占两个字节
* 定义一个方法用来按字节数截取字符串。
* 如:对于“ab你好”,取3个字节,“你”的字节只取了一半,无法正确显示,所以就把那个字节舍去
* 若取4个字节就是“ab你”,取5个字节还是“ab你”

 1 public class Test {
 2 
 3     public static void main(String[] args) throws UnsupportedEncodingException {
 4         String str=new String("ab你好w琲天");
 5         int len=str.getBytes("gbk").length;
 6         for(int x=1;x<=len;x++){
 7             System.out.println("GBK编码,截取"+x+"个字节数的结果是"+cutStringByBytes(str, x));
 8         }
 9 
10         int len2=str.getBytes("utf-8").length;
11         for(int x=1;x<=len2;x++){
12             System.out.println("utf-8编码,截取"+x+"个字节数的结果是"+cutStringU8StringByBytes(str, x));
13         }
14 
15     }
16 //对于utf-8编码,一个汉字三个字节,用int表示都是负数
17     public static String cutStringU8StringByBytes(String str, int len) throws UnsupportedEncodingException {
18         byte[] buf=str.getBytes("utf-8");
19         int count=0;
20         for(int i=len-1;i>=0;i--){
21             if(buf[i]<0)
22                 count++;
23             else 
24                 break;
25         }
26         if(count%3==0){
27             return new String(buf,0,len,"utf-8");
28         }
29         else if(count%3==1)
30             return new String(buf,0,len-1,"utf-8");
31         else
32             return new String(buf,0,len-2,"utf-8");
33     }
34 
35 //对于GBK编码,汉字的编码大部分是两个负数(因为高位字节是1),其他是一个负数一个正数(比如“琲”)
36     public static String cutStringByBytes(String str, int len) throws UnsupportedEncodingException {
37         byte[] buf=str.getBytes("gbk");
38         int count=0;
39         for(int i=len-1;i>=0;i--){
40             if(buf[i]<0)
41                 count++;
42             else 
43                 break;
44         }
45         if(count%2==0){
46             return new String(buf,0,len,"gbk");
47         }
48         else
49             return new String(buf,0,len-1,"gbk");
50     }
51 }

对于字符串“ab你好w琲天”的测试结果如下:

 1 GBK编码,截取1个字节数的结果是a
 2 GBK编码,截取2个字节数的结果是ab
 3 GBK编码,截取3个字节数的结果是ab
 4 GBK编码,截取4个字节数的结果是ab你
 5 GBK编码,截取5个字节数的结果是ab你
 6 GBK编码,截取6个字节数的结果是ab你好
 7 GBK编码,截取7个字节数的结果是ab你好w
 8 GBK编码,截取8个字节数的结果是ab你好w
 9 GBK编码,截取9个字节数的结果是ab你好w琲
10 GBK编码,截取10个字节数的结果是ab你好w琲
11 GBK编码,截取11个字节数的结果是ab你好w琲天
12 
13 utf-8编码,截取1个字节数的结果是a
14 utf-8编码,截取2个字节数的结果是ab
15 utf-8编码,截取3个字节数的结果是ab
16 utf-8编码,截取4个字节数的结果是ab
17 utf-8编码,截取5个字节数的结果是ab你
18 utf-8编码,截取6个字节数的结果是ab你
19 utf-8编码,截取7个字节数的结果是ab你
20 utf-8编码,截取8个字节数的结果是ab你好
21 utf-8编码,截取9个字节数的结果是ab你好w
22 utf-8编码,截取10个字节数的结果是ab你好w
23 utf-8编码,截取11个字节数的结果是ab你好w
24 utf-8编码,截取12个字节数的结果是ab你好w琲
25 utf-8编码,截取13个字节数的结果是ab你好w琲
26 utf-8编码,截取14个字节数的结果是ab你好w琲
27 utf-8编码,截取15个字节数的结果是ab你好w琲天

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值