GBK 字节数分割字符数

**GBK 字节数分割字符串**----------------  

又是一个无聊的周六,最近发生太多的事情,都没时间去静心去学习,做一名程序员还是要静心下来,把基础打好!吃完饭无意中发现包包里面有一张公司的面试题,可能是招实习生的试题。说实话,那些试题我也没去仔细看过,看了下最后一道题,第一眼有点蒙圈,嘿嘿。  

题目:请编写一个函数,完成可以按GBK字节数分割字符串的功能。要求中文不能拆分半个,这样会出现乱码)。实现效果如下:splitByBytes("中文版Java",5),得到["中文","版Jav","a"]。 老实来讲,笔试时间一般都是40分钟~1钟头,在短时间写出规范的代码是不太可能,面试官考察的是你的基本功和思路,如果你很熟练的话,写的完美也不是没可能,所以在没写完的情况下,尽量减少语法错误,改抛异常最好写上,减少别人挑你的毛病机会。看到面试我想了一会,大致记得中文和英文的字节数不太一样,在GBK下,中文占两个字节,两个字节编码都小于0,而英文为一个字节;想到这里我思路已尽,嘿嘿!刚好邻居喊看球赛,又过去看了,哎!  

趁吃完饭那会,又拿出来看了看,花了大致10分钟时间写了并测试了下,完成了第一部分,哎,高手勿喷!  

思路:  

1、题目明显是需要将string转换成byte数组来实现,byte自然少不了;

2、中文占两个字节,并且字节编码都小于0,而英文为单独一个字节,大于0;

3、写代码尽量考虑完整,长度啊,非空等等判断,可能会增加面试官对你态度的认可,呵呵,我YY的,不一定 啊,但是有总比没有好;  

好,废话少说,上代码:

package com.niuxl;

import java.io.UnsupportedEncodingException;

public class StringOperator {

	/**
	 * 
	 * @param src  源字符串
	 * @param bytes 需要截取的字节长度
	 * @throws UnsupportedEncodingException
	 */
	public static void splitString(String src, int bytes) throws UnsupportedEncodingException {  
		// 首先将String转换成byte数组;
		byte buf[] = src.getBytes("gbk") ; 
		@SuppressWarnings("unused")
		String split = "";
		// 若截取长度大于byte数组长度,则将字符串直接返回,特例O(∩_∩)O哈哈~
		if(bytes>=buf.length){
			split = src ;
			System.out.println("截取"+bytes+"个字节为:"+split);
		}else{
			int count = 0;  // 计数器;   
			for(int j = 0; j<bytes; j++){
				if(buf[j]<0){  // 中文两个字节,任何一个字节都是小于0;
					// 判断在byte数组中截取位置之前有多少个编码小于0的字节;
					// 若count为偶数,则说明此截取位置刚好为完整的中文字节;
					// 若count为奇数,则说明当前位置为中文的一半,此截取位置之前为偶数,则完整的中文字节;
					count++ ;
				}else{	// 如果大于0,说明当前字节为非中文字节,则可以直接退出;
					break ;
				}
			}
			if(count%2==0){
				split = new String(buf,0,bytes,"gbk") ;
				System.out.println("截取"+bytes+"个字节为:"+split);
			}else{
				split = new String(buf,0,bytes-1,"gbk") ;
				System.out.println("截取"+bytes+"个字节为:"+split);
			}
		}
	}
	public static void main(String[] args) throws UnsupportedEncodingException {
		// '理想罗胖子Smartison' 中文字符为两个字节,英文为一个字节;
		String str ="罗胖子Smartison" ;
		splitString(str,2) ;
		splitString(str,5) ;
		splitString(str,6) ;
		splitString(str,7) ;
		splitString(str,8) ;
		splitString(str,20) ;
	}
}

Console控制台打印如下:

截取2个字节为:罗
截取5个字节为:罗胖
截取6个字节为:罗胖子
截取7个字节为:罗胖子S
截取8个字节为:罗胖子Sm
截取20个字节为:罗胖子Smartison

   说明下:如果中文截取一个字节的话,会输出"?",说明截取了半个中文,即需要重新调整你的程序了!

恩,上面基本完成了字符串分割,要实现提出的数组形式,应该定义一个数组,遍历取字节add到数组中即可,这里就不在写了,没事儿看看书也挺好的!最近工作不是特别顺心,朋友的“跳槽要趁早”点醒了我,不开心就早点离开去找快乐的事情吧,毕竟不开心的时间也是花费自己的,做喜欢的事儿,顺便赚点钱这才是最好的生活,let it be!

在Java中,如果需要根据字符串的字节数(而非字符数)对字符串进行分割操作,可以借助`String.getBytes()`获取字符串对应的字节数据,并通过手动遍历这些字节来进行切割。 下面是一个简单的步骤说明: ### 步骤 1. 使用 `String.getBytes(Charset charset)` 获取指定编下的字节数组。 - 如果未明确编,默认会使用平台默认编,建议显式指明编如 UTF-8、GBK 等。 2. 遍历这个字节数组,在特定长度处停止并创建一个新的子数组。 3. 将切分后的每个子数组再转回成字符串形式: ```java new String(byteArray, Charset charset) ``` ### 示例代 ```java import java.nio.charset.Charset; public class Main { public static void main(String[] args) { // 原始字符串 (假设包含一些多字节字符) String str = "你好world"; // 指定编方式 (这里我们用UTF-8作为例子) Charset utf8Charset = Charset.forName("UTF-8"); // 转换为字节数组 byte[] bytes = str.getBytes(utf8Charset); int chunkSize = 6; // 分割每段最多多少个字节 for(int i=0;i<bytes.length;i+=chunkSize){ int end = Math.min(bytes.length,i+chunkSize); // 创建新的字节数组片段 byte[] subBytes = new byte[end-i]; System.arraycopy(bytes, i,subBytes ,0,end-i); // 再转换回来为字符串打印查看结果 try{ System.out.println(new String(subBytes,utf8Charset)); }catch(Exception e){ e.printStackTrace(); } } } } ``` 以上示例将原字符串按照给定大小(本例为6字节一段),逐部分地转化为新字符串输出显示出来。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值