Java分割中英文,並且中文不能分割一半?


最近准備入其他坑位。在面試過程中,遇到下面這題筆試題,拿出來分享分享。

題目:編寫一個截取字符串的函數,輸入為一個字符串和字節數,輸出為按字節截取的字符串。但是要保證漢字不被截半個,如“我ABC”4,應該截為“我AB”,輸入“我ABC漢DEF”,6,應該輸出為“我ABC”而不是“我ABC+漢的半個”。

思路:每個文件編碼格式不一致,如UTF-8、GBK等。其中,UTF-8 中文用三個字節表示,GBK 中文用兩個字節表示。並且中文的字節是負數的。可以根據這個原理,把字符串轉化為字節數組,判斷最后字符是否為中文。如果是英文,則直接分割返回。否則,循環遍歷字節數組,並作相應的負數統計並進行求模。

代碼實現:

package com.geshanzsq;
import java.io.UnsupportedEncodingException;
/**
 * @author geshanzsq
*/
public class SubString {

    public static void main(String[] args) throws UnsupportedEncodingException {
        String srcStr1 = "我ABC";
        String srcStr2 = "我ABC漢的DEF";

        splitString(srcStr1, 4);
        splitString(srcStr2, 6);

    }

    public static void splitString(String str,int size) throws UnsupportedEncodingException {
        //判斷是否為空
        if(str==null){
            System.out.println("splitString is null");
            return;
        }
        //判斷分割位置是否小於等於0
        if(size<=0){
            System.out.println("截取字節長度必須大於0");
            return;
        }

        //默認UTF-8 中文一般三個字節表示,gbk兩個字節,UTF-8變化就是%3,gbk變化就是%3
        byte[] bytes = str.getBytes("gbk");
        //如果截取長度大於bytes長度,則直接打印字符串
        if(size >= bytes.length){
            System.out.println("splitString="+str);
            return ;
        }
        //如果是中文,bytes為負數。最后一個不是中文,則直接分割
        if(bytes[size-1] > 0){
            String splitString = new String(bytes,0,size,"gbk");
            System.out.println("splitString="+splitString);
            return;
        }
        //字節負數統計並進行求模​
        int num = 0;
        //循環到需要分割的長度,后面的不需要
        for(int i = 0 ; i < size; i++ ){
            if(bytes[i]<0){
                num++;
                num = num % 2;
            }
        }
        String splitString = new String(bytes,0,size-num,"gbk");
        System.out.println("splitString="+splitString);
    }
}

運行結果:

splitString=我AB  
splitString=我ABC


免責聲明!

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



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