ホームページ  >  記事  >  Java  >  Javaで文字列インターセプトを実装するにはどうすればよいですか?

Javaで文字列インターセプトを実装するにはどうすればよいですか?

黄舟
黄舟オリジナル
2017-08-03 15:32:511625ブラウズ

この記事では、主に Java 文字列インターセプトの詳細な例に関する関連情報を紹介します。このような機能を実現するのに役立つコード例を示します。必要な方は、

Java 文字列インターセプトの詳細な例を参照してください。 Java では、文字列「abcd」と文字列「abhello」の長さは同じで、どちらも 4 文字です。

ただし、対応するバイト数は異なり、漢字1文字は2バイトを占めます。


指定されたバイト数に従って部分文字列を取得するメソッドを定義します。


例: 「Hello ab」の場合、3 バイトを取る場合、部分文字列は単語 ab と「you」の半分であるため、その半分は破棄する必要があります。


4バイトを取っても「ab you」になり、5バイトを取っても「ab you」になります。


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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。