zoukankan      html  css  js  c++  java
  • 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琲天
  • 相关阅读:
    汉诺塔问题
    两个有序链表序列的合并
    数列求和
    求集合数据的均方差
    [NOIP2014] 提高组 洛谷P1328 生活大爆炸版石头剪刀布
    [NOIP2014] 普及组
    洛谷P1726 上白泽慧音
    洛谷P1808 单词分类
    洛谷P1889 士兵站队
    洛谷P1288 取数游戏II
  • 原文地址:https://www.cnblogs.com/wsw-tcsygrwfqd/p/6644851.html
Copyright © 2011-2022 走看看