**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!