Javaは中英文を分割して、しかも中国語は半分を分割することができませんか?

2187 ワード

最近他のピットに入る準備をしています.面接の過程で、次の問題に出会って、分かち合います.
タイトル:文字列を切り取る関数を作成し、文字列とバイト数を入力し、バイトで切り取る文字列として出力します.しかし、漢字が半分に切られないことを保証するには、「私ABC」4のように、「私AB」に切るべきで、「私ABC漢DEF」を入力し、6、「私ABC+漢の半分」ではなく「私ABC」に出力すべきだ.
考え方:UTF-8、GBKなど、ファイルごとの符号化フォーマットが一致しません.このうちUTF-8は中国語で3バイト、GBKは中国語で2バイトとなっている.そして中国語のバイトは負数です.この原理に基づいて,文字列をバイト配列に変換し,最後の文字が中国語であるか否かを判断することができる.英語の場合は、直接分割して返します.そうでなければ、バイト配列をループし、対応する負数統計を行い、モデリングを行います.
コード実装:
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

転載先:https://www.cnblogs.com/geshanzsq/p/11099266.html