package com.itheima;
import java.awt.List;
import java.util.ArrayList;
/**
* 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
* @author 支胜勇
*
*/
public class Test10 {
/***
* 按字节截取字符串,算法:首先将原字符串中的所有汉字字节放到指定的数组中,
* 然后根据要截取的字节数判断最后一个字节是否要截汉字,如果要截汉字,
* 则有两种情况。第一中是截取完整的汉字,这种情况下splitlength在hanziByteArr中的序号是偶数的;
* 第二种是截取半个汉字,此种情况splitlength在hanziByteArr中的序号是奇数,则此时截取splitlength-1个字节即可;
* @param strSrc
* @param splitlength
*/
public static void splitStr(String strSrc, int splitBytelength) {
int bytelength = 0;
if (strSrc ==null ||strSrc=="") {
System.err.println("字符串不能为空!");
return;
}
byte byteStr[] = strSrc.getBytes(); // 将String转换成byte字节数组
//定义存放汉字字节数的变量hanziByteCount,且hanziByteCount为偶数
int hanziByteCount=0;
//求strSrc中的所有汉字字节数
for(int i=0;i<byteStr.length;i++){
if(byteStr[i] < 0){
hanziByteCount++;
}
}
//定义存放strSrc中的所有汉字字节的数组
byte hanziByteArr[]=new byte[hanziByteCount];
//重置变量hanziByteCount
hanziByteCount=0;
//将strSrc中的所有汉字字节放到数组hanziByteArr中
for(int i=0;i<byteStr.length;i++){
if(byteStr[i] < 0){
hanziByteArr[hanziByteCount]=(byteStr[i]);
hanziByteCount++;
}
}
bytelength = byteStr.length;
String subStr="";
if (splitBytelength >= bytelength)
{//全部截完
subStr = new String(byteStr, 0, bytelength);
}else
{
// 判断是否截汉字字节,如果是的话字节对应的ASCII码是小于0的值 ,因为汉字的ASCII最高位也就是符号位小于零
if (byteStr[splitBytelength-1] < 0) {//判断要截取的最后一个字节是否包含汉字
//定义要截取的汉字字节在hanziByteArr中的位置
int hanziPosition=0;
for(int i=0;i<hanziByteArr.length;i++){
if(byteStr[splitBytelength-1]==hanziByteArr[i]){
//数组的下标是从零开始的,所以要加1
hanziPosition=i+1;
break;
}
}
if(hanziPosition%2==0){//如果要截取的汉字字节位置在hanziByteArr中的序号是偶数,则截取的是完整的汉字,否则是截半
subStr = new String(byteStr, 0, splitBytelength);
}else{
subStr = new String(byteStr, 0, splitBytelength-1);
}
} else {
System.out.print(byteStr[splitBytelength]);
subStr = new String(byteStr, 0, splitBytelength);
}
}
System.out.print("您从“"+strSrc+"”中按"+splitBytelength+"个字节截取的字符串是:"+subStr+";\r\n");
}
/***
* 程序入口
* @param args
*/
public static void main(String[] args) {
//定义两个测试字符串
String testStr1 = "zhisy黑马程g序员的理想2014";
String testStr2 = "test@黑马训练f营-支胜勇";
//调用splitStr(String ,int )来获取结果
splitStr(testStr1, 25);
splitStr(testStr2, 14);
}
}
|
|