程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> java按字節截取帶有漢字的字符串的解法(推舉)

java按字節截取帶有漢字的字符串的解法(推舉)

編輯:關於JAVA

java按字節截取帶有漢字的字符串的解法(推舉)。本站提示廣大學習愛好者:(java按字節截取帶有漢字的字符串的解法(推舉))文章只能為提供參考,不一定能成為您想要的結果。以下是java按字節截取帶有漢字的字符串的解法(推舉)正文


因為接口應用的oracle字段長度為固定字節數,然後傳出去的字符串估量比數據庫字段的總字節數要年夜,那末截取小於數據庫字節數的字符串。

本身參考網上的例子,整了個遞歸挪用便可以了,由於截取的字符字節長度必需小與數據庫的字節長度,即假如最初一個字符為漢字,那末只能去失落往前截取。

/** 
   * 斷定傳出去的字符串,能否 
   * 年夜於指定的字節,假如年夜於遞歸挪用
   * 直到小於指定字節數 ,必定要指定字符編碼,由於各個體系字符編碼都紛歧樣,字節數也紛歧樣 
   * @param s 
   *      原始字符串 
   * @param num 
   *      傳出去指定字節數 
   * @return String 截取後的字符串 

   * @throws UnsupportedEncodingException 
   */ 
  public static String idgui(String s,int num)throws Exception{
    int changdu = s.getBytes("UTF-8").length;
    if(changdu > num){
      s = s.substring(0, s.length() - 1);
      s = idgui(s,num);
    }
    return s;
  }

java面試題:

編寫一個截取字符串的函數,輸出為一個字符串和字節數,輸入為按字節截取的字符串。然則要包管漢字不被截半個,如"我ABC"4,應當截為"我AB",輸出"我ABC漢DEF",6,應當輸入為"我ABC"而不是"我ABC+漢的半個"。

今朝許多風行的說話,如C#、Java外部采取的都是 Unicode 16(UCS2)編碼,在這類編碼中一切的字符都是兩個字符,是以,假如要截取的字符串是中、英文、數字混雜的,就會發生成績,以下面的字符串:

String s = "a加b等於c,假如a等1、b等於2,那末c等3";

下面的字符串既有漢字,又有英文字符和數字。假如要截取前6個字節的字符,應當是”a加b等",但假如用substring辦法截取前6個字符就成了"a 加b等於c"。發生這個成績的緣由是將substring辦法將雙字節的漢字當做一個字節的字符(UCS2字符)處置了。

英文字母和中文漢字在分歧的編碼格局下,所占用的字節數也是分歧的,我們可以經由過程上面的例子來看看在一些罕見的編碼格局下,一個英文字母和一個中文漢字分離占用若干字節。

import java.io.UnsupportedEncodingException;  
 
public class EncodeTest {  
  /** 
   * 打印字符串在指定編碼下的字節數和編碼稱號到掌握台 
   *  
   * @param s 
   *      字符串 
   * @param encodingName 
   *      編碼格局 
   */ 
  public static void printByteLength(String s, String encodingName) {  
    System.out.print("字節數:");  
    try {  
      System.out.print(s.getBytes(encodingName).length);  
    } catch (UnsupportedEncodingException e) {  
      e.printStackTrace();  
    }  
    System.out.println(";編碼:" + encodingName);  
  }  
 
  public static void main(String[] args) {  
    String en = "A";  
    String ch = "人";  
 
    // 盤算一個英文字母在各類編碼下的字節數 
    System.out.println("英文字母:" + en);  
    EncodeTest.printByteLength(en, "GB2312");  
    EncodeTest.printByteLength(en, "GBK");  
    EncodeTest.printByteLength(en, "GB18030");  
    EncodeTest.printByteLength(en, "ISO-8859-1");  
    EncodeTest.printByteLength(en, "UTF-8");  
    EncodeTest.printByteLength(en, "UTF-16");  
    EncodeTest.printByteLength(en, "UTF-16BE");  
    EncodeTest.printByteLength(en, "UTF-16LE");  
 
    System.out.println();  
 
    // 盤算一個中文漢字在各類編碼下的字節數 
    System.out.println("中文漢字:" + ch);  
    EncodeTest.printByteLength(ch, "GB2312");  
    EncodeTest.printByteLength(ch, "GBK");  
    EncodeTest.printByteLength(ch, "GB18030");  
    EncodeTest.printByteLength(ch, "ISO-8859-1");  
    EncodeTest.printByteLength(ch, "UTF-8");  
    EncodeTest.printByteLength(ch, "UTF-16");  
    EncodeTest.printByteLength(ch, "UTF-16BE");  
    EncodeTest.printByteLength(ch, "UTF-16LE");  
  }  
} 

運轉成果以下:

1.英文字母:A
2.字節數:1;編碼:GB2312
3.字節數:1;編碼:GBK
4.字節數:1;編碼:GB18030
5.字節數:1;編碼:ISO-8859-1
6.字節數:1;編碼:UTF-8
7.字節數:4;編碼:UTF-16
8.字節數:2;編碼:UTF-16BE
9.字節數:2;編碼:UTF-16LE
10.中文漢字:人
11.字節數:2;編碼:GB2312
12.字節數:2;編碼:GBK
13.字節數:2;編碼:GB18030
14.字節數:1;編碼:ISO-8859-1
15.字節數:3;編碼:UTF-8
16.字節數:4;編碼:UTF-16
17.字節數:2;編碼:UTF-16BE
18.字節數:2;編碼:UTF-16LE

UTF-16BE和UTF-16LE是UNICODE編碼家族的兩個成員。UNICODE尺度界說了UTF-8、UTF-16、UTF-32三種編碼格局,共有UTF-8、UTF-16、UTF-16BE、UTF-16LE、UTF-32、UTF-32BE、UTF-32LE七種編碼計劃。JAVA所采取的編碼計劃是UTF-16BE。從上例的運轉成果中我們可以看出,GB2312、GBK、GB18030三種編碼格局都可以知足標題的請求。上面我們就以GBK編碼為例來停止解答。

我們不克不及直接應用String類的substring(int beginIndex, int endIndex)辦法,由於它是按字符截取的。'我'和'Z'都被作為一個字符來對待,length都是1。現實上我們只需能辨別開中文漢字和英文字母,這個成績就水到渠成了,而它們的差別就是,中文漢字是兩個字節,英文字母是一個字節。

package com.newyulong.iptv.billing.ftpupload;

import java.io.UnsupportedEncodingException;

public class CutString {
   /** 
   * 斷定能否是一個中文漢字 
   * 
   * @param c 
   *      字符 
   * @return true表現是中文漢字,false表現是英文字母 
   * @throws UnsupportedEncodingException 
   *       應用了JAVA不支撐的編碼格局 
   */ 
  public static boolean isChineseChar(char c) 
      throws UnsupportedEncodingException { 
    // 假如字節數年夜於1,是漢字 
    // 以這類方法差別英文字母和中文漢字其實不是非常嚴謹,但在這個標題中,如許斷定曾經足夠了 
    return String.valueOf(c).getBytes("UTF-8").length > 1; 
  } 
 
  /** 
   * 按字節截取字符串 
   * 
   * @param orignal 
   *      原始字符串 
   * @param count 
   *      截取位數 
   * @return 截取後的字符串 
   * @throws UnsupportedEncodingException 
   *       應用了JAVA不支撐的編碼格局 
   */ 
  public static String substring(String orignal, int count) 
      throws UnsupportedEncodingException { 
    // 原始字符不為null,也不是空字符串 
    if (orignal != null && !"".equals(orignal)) { 
      // 將原始字符串轉換為GBK編碼格局 
      orignal = new String(orignal.getBytes(), "UTF-8");//
     // System.out.println(orignal);
     //System.out.println(orignal.getBytes().length);
      // 要截取的字節數年夜於0,且小於原始字符串的字節數 
      if (count > 0 && count < orignal.getBytes("UTF-8").length) { 
        StringBuffer buff = new StringBuffer(); 
        char c; 
        for (int i = 0; i < count; i++) {
          System.out.println(count);
          c = orignal.charAt(i); 
          buff.append(c); 
          if (CutString.isChineseChar(c)) { 
            // 碰到中文漢字,截取字節總數減1 
            --count; 
          } 
        } 
      //  System.out.println(new String(buff.toString().getBytes("GBK"),"UTF-8"));
        return new String(buff.toString().getBytes(),"UTF-8"); 
      } 
    } 
    return orignal; 
  } 
 
  /** 
   * 按字節截取字符串 
   *  
   * @param orignal 
   *      原始字符串 
   * @param count 
   *      截取位數 
   * @return 截取後的字符串 
   * @throws UnsupportedEncodingException 
   *       應用了JAVA不支撐的編碼格局 
   */ 
  public static String gsubstring(String orignal, int count)  
      throws UnsupportedEncodingException {  
    // 原始字符不為null,也不是空字符串  
    if (orignal != null && !"".equals(orignal)) {  
      // 將原始字符串轉換為GBK編碼格局  
      orignal = new String(orignal.getBytes(), "GBK");  
      // 要截取的字節數年夜於0,且小於原始字符串的字節數  
      if (count > 0 && count < orignal.getBytes("GBK").length) {  
        StringBuffer buff = new StringBuffer();  
        char c;  
        for (int i = 0; i < count; i++) {  
          c = orignal.charAt(i);  
          buff.append(c);  
          if (CutString.isChineseChar(c)) {  
            // 碰到中文漢字,截取字節總數減1  
            --count;  
          }  
        }  
        return buff.toString();  
      }  
    }  
    return orignal;  
  } 
  
  /** 
   * 斷定傳出去的字符串,能否 
   * 年夜於指定的字節,假如年夜於遞歸挪用
   * 直到小於指定字節數 
   * @param s 
   *      原始字符串 
   * @param num 
   *      傳出去指定字節數 
   * @return String 截取後的字符串 
   */ 
  public static String idgui(String s,int num){
    int changdu = s.getBytes().length;
    if(changdu > num){
      s = s.substring(0, s.length() - 1);
      s = idgui(s,num);
    }
    return s;
  }
  
  public static void main(String[] args) throws Exception{ 
    // 原始字符串 
    String s = "我ZWR愛你們JAVA"; 
    System.out.println("原始字符串:" + s + " : 字節數是: " + s.getBytes().length); 

/*      System.out.println("截取前1位:" + CutString.substring(s, 1)); 
      System.out.println("截取前2位:" + CutString.substring(s, 2)); 
      System.out.println("截取前4位:" + CutString.substring(s, 4)); */ 
      //System.out.println("截取前12位:" + CutString.substring(s, 12)); 
      System.out.println("截取前12字節:" + CutString.idgui(s, 11)); 
    
  }  
}

以上這篇java按字節截取帶有漢字的字符串的解法(推舉)就是小編分享給年夜家的全體內容了,願望能給年夜家一個參考,也願望年夜家多多支撐。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved