前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分割中英文,并且中文不能分割一半?

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

作者头像
格姗知识圈
发布2019-07-19 14:42:06
8480
发布2019-07-19 14:42:06
举报
文章被收录于专栏:格姗知识圈格姗知识圈

最近准备入其他坑位。在面试过程中,遇到下面这题笔试题,拿出来分享分享。

题目:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个”。

思路:每个文件编码格式不一致,如UTF-8、GBK等。其中,UTF-8 中文用三个字节表示,GBK 中文用两个字节表示。并且中文的字节是负数的。可以根据这个原理,把字符串转化为字节数组,判断最后字符是否为中文。如果是英文,则直接分割返回。否则,循环遍历字节数组,并作相应的负数统计并进行求模。

代码实现:

代码语言:javascript
复制
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);
    }
}

运行结果:

代码语言:javascript
复制
splitString=我AB
splitString=我ABC

推荐阅读

Nginx是什么?能干嘛?

还在使用SimpleDateFormat?你的项目崩没?

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-06-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 格姗知识圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档