zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    poj 3040 Allowance
    poj 2393 Yogurt factory
    【BZOJ1833】数字计数(ZJOI2010)-数位DP
    【BZOJ4820】硬币游戏(SDOI2017)-概率+高斯消元+KMP
    【BZOJ3626】LCA(LNOI2014)-树链剖分+离线处理
    【BZOJ4817】树点涂色(SDOI2017)-LCT+LCA+线段树
    【BZOJ1135】LYZ(POI2009)-线段树+Hall定理
    【CF392D】Three Arrays-set+multiset
    【51Nod1688】LYKMUL-线段树+乘法原理
    【BZOJ2956】模积和-数论分块
  • 原文地址:https://www.cnblogs.com/geshanzsq/p/11099266.html
Copyright © 2011-2022 走看看