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

简介: 本文分享一道Java字符串截取笔试题:按字节数截取,但需避免汉字被截断。核心思路是利用GBK编码中中文占2字节、字节值为负的特性,通过统计负数字节个数并模2调整截取位置,确保汉字完整性。附完整可运行代码及示例结果。

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

题目: 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我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
相关文章
|
24天前
|
Java 程序员
Java日期工具类:日期转化、今天日期、昨天日期、明天日期、指定日期
程序员常被日期转换困扰?本文分享自研Java日期工具类DateTools,支持今天/明天/昨天获取、日期与字符串双向转换、指定日期前后天计算等功能,代码简洁实用,助你提升开发效率!
143 1
|
24天前
|
SQL 搜索推荐 关系型数据库
|
18天前
|
Oracle Java 关系型数据库
Linux 安装 JDK 环境
由于 JDK1.8.202 是最后一个免费版本,建议下载此版本。由于在 Oracle 官方网站下载需要登录,可通过华为云镜像下载。
234 1
Linux 安装 JDK 环境
|
18天前
|
Java API Maven
Spring Boot 创建项目详细介绍
如何创建一个 Spring Boot 项目,以及自动生成的目录文件作用。
103 2
|
19天前
|
前端开发 Java 数据库连接
Spring Boot 详细简介!
Spring Boot 是什么?能干啥?
213 0
Spring Boot 详细简介!
|
1月前
|
消息中间件 存储 人工智能
免费送 10 张三天通票!邀你共赴 ApacheCon 2026
Community Over Code 是 Apache 软件基金会(ASF)官方全球系列大会,今年,Community Over Code Asia 2026 将于 8 月 7-9 日在北京市海淀区中关村国家自主创新示范区会议中心举行,覆盖 AI、云原生、大数据、开源社区治理等热点领域。阿里云云原生应用平台团队将携手开源社区贡献者和用户们,在消息、微服务、Web 应用与框架三大领域带来 11 个议题,欢迎大家报名参加。关注阿里云云原生公众号,在本文章评论区留言回复 ASFC+你想听的议题,前 10 名参与互动的用户将获得大会三天通票一张(价值 999 元)。
|
24天前
|
人工智能 安全 前端开发
基于 AgentScope 构建金融级智能体底座实战
金融级 AI 原生智能体底座白皮书发布。
|
24天前
|
文字识别 安全 Windows
【2026】Umi-OCR文字识别工具:截图/批量/PDF识别全支持
Umi-OCR是一款免费开源的离线OCR软件,支持截图、图片、扫描PDF文字识别,全程本地运行,保障隐私安全。提供Paddle(高性能)和Rapid(低配兼容)双引擎,操作简单,支持批量处理与多格式导出。
|
24天前
|
人工智能 编解码 JSON
面向连载内容的 AI 漫剧工程化实现:ComfyUI 工作流、帧校验与时序优化完整方案
本文详解本地AI漫剧完整离线生产管线:解决角色漂移、色彩闪烁、线条软化、流程割裂四大痛点。基于开源工具,提供ComfyUI工作流、Python校验脚本、FFmpeg批处理等可运行代码,8G显存即可实现人设锁定→分镜渲染→时序修复→超分导出全流程。

热门文章

最新文章