按字節截取字符串避免半個漢字


【總結:】

     思路:漢字的unicode編碼都是負數

     注意事項:字符串的輸入編碼和輸出編碼、已經eclipse等編譯工具的編碼都會影響結果   所有最好把編碼設置一下或統一;

【自己的代碼】

 1 package text;
 2 import java.io.IOException;
 3 import java.util.Scanner;
 4 public class StringTest {
 5     /*
 6      * 思路:漢子編碼為負數
 7      * 注意:不同編碼的字節位數不同,需要區分對待
 8      */
 9     public static void main(String[] args) throws IOException  {
10         int count=0;
11         //輸入字符串和截取長度
12         Scanner sc=new Scanner(System.in);
13         System.out.println("請輸入字符串:");
14         String s=sc.nextLine();
15         byte[] b=s.getBytes("GBK");
16         System.out.println("請輸入截取長度:");
17         int num=sc.nextInt();
18         if(num>b.length||num<0){
19             System.out.println("輸入數字不正確!");
20             return ;
21         }
22         //統計截取的字符串包括多少負值,一邊避免半個漢字
23         for(int i=0;i<num;i++){
24             if(b[i]<0){
25                 count++;
26             }
27         }
28         //因為是GBK,所有模2來判斷
29         if(count%2==0){
30             System.out.println("截取的字符串為:"+new String(b,0,num,"GBK"));
31         }else{
32             System.out.println("截取的字符串為:"+new String(b,0,num-1,"GBK"));
33         }
34     }
35 }

 

【網上參考】

今天去一個公司面試,碰到一個很久前練過的題目,竟然沒答出來,感覺好囧!!回來好好研究一番,貼上代碼:

String類的length()方法是以unicode代碼單元,換言之就是char的個數為來統計的。所以使用subString等截取出來的子串都不會出現半個漢字的情況,因為java一個char類型可以存放一個漢字(2個字節)。而如果以字節byte來截取字符串,就會出現半個漢字的情況。

這道題就是這樣的要求:

編寫一個截取字符串的方法,參數為一個字符串和字節數,返回按字節數截取的子串,保證漢字不被截半個。如:輸入"我abc"、4,應該截為"我ab"。輸入"我abc漢def"、6,應該截為"我abc"

思路:漢字的unicode編碼都是負數,如果這些負數字節在截取的字節數組中成對出現,說明不會截取到半個漢字。如果不是成對出現,則會截取到半個漢字,需要將最后一個字節舍去。

復制代碼
public class StrTest {
    /***
     * 按字節數截取字符串, 不能截出半個漢字, 如果是半個漢字則舍去!
     * 
     * @param source
     * @param num
     * @return
     */
    public static void cutString(String source, int byteCount) {
        byte[] byteArr = source.getBytes();
        int count = 0;
        // 統計要截取的那部分字節中負數的個數
        for (int i = 0; i < byteCount; i++) {
            if (byteArr[i] < 0) {
                count++;
            }
        }
        // 負數成對出現 則不會出現半個漢字
        if (count % 2 == 0)
            System.out.println(new String(byteArr, 0, byteCount));
        // 負數個數不是偶數,則有半個漢字
        else
            System.out.println(new String(byteArr, 0, byteCount - 1));
    }

    public static void main(String[] args) {
        cutString("我aabc中國cccr", 6);
    }

}
復制代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM