首頁  >  文章  >  Java  >  Java如何實作字串截取?

Java如何實作字串截取?

黄舟
黄舟原創
2017-08-03 15:32:511623瀏覽

這篇文章主要介紹了java 字串截取的實例詳解的相關資料,這裡提供了實例程式碼幫助大家實現這樣的功能,需要的朋友可以參考下

java 字串被截取的實例詳解

前言:

在Java中,字串「abcd」與字串「ab你好」的長度是一樣,都是四個字元。

但對應的位元組數不同,一個漢字佔兩個位元組。

定義一個方法,依照指定的位元組數來取子字串。

如:對於“ab你好”,如果取三個位元組,那麼子字串就是ab與“你”字的半個,那麼半個就要捨棄。

如果取四個位元組就是“ab你”,取五個位元組還是“ab你”。

只考慮GBK和utf-8編碼

實例碼:


##

import java.io.UnsupportedEncodingException;

import org.junit.Test;

/**
 * @author<a href="mailto:953801304@qq.com" rel="external nofollow" >胡龙华</a>
 * @version 2017-4-4 下午1:08:45
 * @fileName StringCut.java
 */
public class StringCut {

  @Test
  public void analyze(){
    String str1 = "你好abc";
    byte[] bs1=null;
    byte[] bs2=null;
    try {
       bs1 = str1.getBytes("GBK");
       System.out.println("---GBK---");
       for(byte b:bs1){
         System.out.print(b+" ");
       }
       System.out.println();
      //-60 -29 -70 -61 97 98 99 
      // 发现规律,再gbk中一个中文汉字 都是以两个字节 小于0的数存储
       bs2 = str1.getBytes("utf-8");
       System.out.println("---utf-8---");
       for(byte b:bs2){
         System.out.print(b+" ");
       }
      //-28 -67 -96 -27 -91 -67 97 98 99 
      // 发现规律,在utf-8中一个中文汉字 是以三个字节 小于0 的数存储
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }
  }
  /**
   * 思路:从第len个往前数,连续2的倍数个负数则全部输出,单数个则去掉最后一个输出
   * @param str
   * @param len
   * @return
   */
  private static String StringCutByGBK(String str,int len){
    byte[] bs = null;
    try {
      int count = 0;
      bs = str .getBytes("GBK");
      for(int i=len-1;i>=0;i--){
        if(bs[i]<0){
          count++;
        }else{
          break;
        }
        // 0  1  2  3  4 5  6 7  8  9  10 11 12  
      }  //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25 
      if(count%2==0){
        String s=new String(bs, 0, len, "GBK");
        System.out.println("截取"+len+"个字符:"+s);
      }else{
        String s=new String(bs, 0, len-1, "GBK");
        System.out.println("截取"+len+"个字符:"+s);
      }
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    return null;
  }
  /**
   * 思路:从第len个往前数,连续3的倍数个负数则全部输出,其他情况则去掉最后count%3个输出
   * @param str
   * @param len
   * @return
   */
  private static String StringCutByUTF8(String str,int len){
    byte[] bs = null;
    try {
      int count = 0;
      bs = str .getBytes("UTF-8");
      for(int i=len-1;i>=0;i--){
        if(bs[i]<0){
          count++;
        }else{
          break;
        }
      }  
      // 0  1  2  3  4  5  6 7 8 9  10 11 12
      //-60 -29 -70 -61 -80 -95 97 98 99 -76 -17 -72 -25 
      if(count%3==0){
        String s=new String(bs, 0, len, "UTF-8");
        System.out.println("截取"+len+"个字符:"+s);
      }else{
        String s=new String(bs, 0, len-count%3, "UTF-8");
        System.out.println("截取"+len+"个字符:"+s);
      }
    } catch (UnsupportedEncodingException e) {
      e.printStackTrace();
    }

    return null;
  }
  @Test
  public void TEST() {
    String str = "你好啊abc达哥";
    try {
      System.out.println("---测试gbk---");
      byte bs [] = str.getBytes("GBK");
      for(int i=0;i<=bs.length;i++){
        //System.out.print(bs[i]+" ");
        StringCutByGBK(str,i);

      }

      System.out.println("---测试UTF-8---");
      byte bs2 [] = str.getBytes("utf-8");
      for(int i=0;i<=bs2.length;i++){
        //System.out.print(bs[i]+" ");
        StringCutByUTF8(str,i);

      }
    } catch (UnsupportedEncodingException e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }

  }

}

以上是Java如何實作字串截取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn