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

题目:编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。但是要保证汉字不被截半个,如“我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

Java分割中英文,并且中文不能分割一半?的更多相关文章

  1. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  2. JAVA 一个或多个空格分割字符串

    知识补充 String的split方法支持正则表达式: 正则表达式\s表示匹配任何空白字符,+表示匹配一次或多次. 有了以上补充知识,下面的内容就很好理解了. 一.待分割字符串 待分割字符串为如下: ...

  3. 深入剖析Java编程中的中文问题及建议最优解决方法

    摘录自:http://fafeng.blogbus.com/logs/3062998.html http://www.blogbus.com/fafeng-logs/3063006.html 深入剖析 ...

  4. Google Java编程风格指南(中文+原始)

    目录 前言 源文件基础 源文件结构 格式 命名约定 编程实践 Javadoc 后记 前言 这份文档是Google Java编程风格规范的完整定义.当且仅当一个Java源文件符合此文档中的规则, 我们才 ...

  5. java 实现中英文拼写检查和错误纠正?可我只会写 CRUD 啊!

    简单的需求 临近下班,小明忙完了今天的任务,正准备下班回家. 一条消息闪烁了起来. "最近发现公众号的拼写检查功能不错,帮助用户发现错别字,体验不错.给我们系统也做一个." 看着这 ...

  6. 关于java.util.Properties读取中文乱码的正确解决方案(不要再用native2ascii.exe了)

    从Spring框架流行后,几乎根本不用自己写解析配置文件的代码了,但近日一个基础项目(实在是太基础,不能用硕大繁琐的Spring), 碰到了用java.util.Properties读取中文内容(UT ...

  7. Java判断字符串是中文还是英文

    在做开发的时候我们经常需要用到根据某个字符或者字符串来判断其是中文还是英文,从而做相应的处理,其实不难,大多数人们都是用到正则来判断的,下面小贝就给大家分享一下Java判断字符串是中文还是英文 推荐文 ...

  8. Allegro PCB -内层分割,比如电源层需要分割几种电源

    内层分割,比如电源层需要分割几种电源. (1).点击Display -> Assign Color 在Option中,先取一种颜色作为高亮显示的颜色. (2).在Find中,选Net,点击mor ...

  9. java中用正则表达式判断中文字符串中是否含有英文或者数字

    public static boolean includingNUM(String str)throws  Exception{ Pattern p  = Pattern.compile(" ...

  10. Java自学-I/O 中文问题

    Java中的编码中文问题 步骤 1 : 编码概念 计算机存放数据只能存放数字,所有的字符都会被转换为不同的数字. 就像一个棋盘一样,不同的字,处于不同的位置,而不同的位置,有不同的数字编号. 有的棋盘 ...

随机推荐

  1. 检测鼠标指针的改变(使用GetCursorInfo API函数)

    第一步:定义全局变量用于状态改变时的对比 var Form1: TForm1; OldCI:HICON; 第二步:添加Timer组件,Interval设置随意一般50就可以了. 增加Memo组件用于记 ...

  2. Android 在子线程中更新UI的几种方法

    第一种: new Handler(context.getMainLooper()).post(new Runnable() { @Override public void run() { // 在这里 ...

  3. windows 10 使用 tricks

    全新的环境变量编辑界面, 全新的[任务管理器]⇒ [性能] 0. 添加开机启动项 将要添加的开机自启动软件的快捷方式添加到如下的路径: C:\Users\hasee\AppData\Roaming\M ...

  4. android4.4系统解决“ERRORcouldn&#39;t find native method”方法

    android4.4系统解决"ERRORcouldn't find native method"方法 今天笔者在移植一个tv模块从android4.2到android4.4系统的设 ...

  5. 讨论IM软件“网上假货’

    概要 网上假货.在不能使用网络的情况下,IM软件还显示在线. 网上是假的"在线--当前离线"之间的状态,在这段时期.用户无法发送消息.用户可以创建假冒网上心跳的错觉(点击了解).缓 ...

  6. 使用 matlab 数据集的生成(generate datasets)

    一般手工生成的数据集(artificial datasets),通常用于实验部分最开始的演示和示意,用于对结果的一种精确计算和量化分析. 1. Swiss/Helix/Twinpeaks/Broken ...

  7. angular.js分页代码的实例

    对于大多数web应用来说显示项目列表是一种很常见的任务.通常情况下,我们的数据会比较多,无法很好地显示在单个页面中.在这种情况下,我们需要把数据以页的方式来展示,同时带有转到上一页和下一页的功能.现在 ...

  8. Install Oracle 12c R2 on CentOS 7 silently

    准备工作 VMware 虚拟机 CentOS 7 17.08 系统安装包镜像 Oracle 12c R2 软件安装包 配置 yum 库并安装如下包 binutils-2.23.52.0.1-12.el ...

  9. 深入解析Android关机

    下图详细阐释了Android的关机顺序. 第一步: 按住电源按钮半秒钟(500ms). 第二步: 之后,PhoneWindowManager.java 将捕获长按电源按钮这一事件并调用“interce ...

  10. Linux命令扫盲 之 sar

    今天在读<大规模Web服务开发技术>一书的时候,书中提到了sar这个命令,感觉很有用,有必要整理学习一下.(对于一位Linux初学者,不能放过任何一个学习机会 :P) 打开自己的CentO ...