package com.itheima;
import java.io.UnsupportedEncodingException;
public class Test10
{
/**
* 第10题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
*
* 思路: 1、先将字符串转换为字节数组。
* 2、定义一个StringBuilder用来接收截取的字符。
* 3、假设要截取前x个字节,首先将第一个字节转换为字符,如果该字符在[a-zA-Z0-9]的范围内(也可以加进其他符号,
* 这里只判断是否为字母和数字),则是个完整的字符,用StringBuilder接收这个字符,继续判断下一个字节
* 4、如果第i个字符不在[a-zA-Z0-9]范围内,那么该字节表示的是半个中文,
* 判断第i+1个字节所表示的字符是否也不在[a-zA-Z0-9]范围内,如果不在,则i和i+1两个字节表示一个中文
* 这时要注意i+1是否大于x,如果i+1>x则要舍弃i和i+1这两个字节,否则用StringBuilder接收这个中文,
* 并使i=i+2,继续判断中文后面的字节
* @author 史世锋
* @param args
*/
public static void main(String[] args)throws Exception
{
//定义一个字符串
String str = "Hello黑马I'm coming";
//截取前8个字节,赋值给str并打印
str = intercept(str, 8);
System.out.println(str);
}
//定义一个函数,接收被截取的字符串str及要截取的字节数index
public static String intercept(String str, int index)
{
//将字符串转换为字节数组(GBK码表)
byte[] buff = null;
try
{
buff = str.getBytes("GBK");
} catch (UnsupportedEncodingException e)
{
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//定义一个变量count,用来记录以截取的字符串中中文的个数
int count = 0;
//定义一个StringBuilder
StringBuilder sb = new StringBuilder();
//循环判断index前每一个字节
for(int i = 0; i< index; i++)
{
//判断字节所表示的字符是否在[a-zA-Z0-9]范围内
if( (char)buff[i] >= 'A' && (char)buff[i] <='Z'||
(char)buff[i] >= 'a' && (char)buff[i] <='z'||
(char)buff[i] >= '0' && (char)buff[i] <='9')
{
//将获取的字符存入StringBuilder
sb.append((char)buff[i]);
}
else
{
//如果第i个字符不在[a-zA-Z0-9]范围内,判断i+1是否大于index
if( (i+1 <index) &&
!((char)buff[i+1] >= 'A' && (char)buff[i+1] <='Z'||
(char)buff[i+1] >= 'a' && (char)buff[i+1] <='z'||
(char)buff[i+1] >= '0' && (char)buff[i+1] <='9'))
{
//将获取的中文存入StringBuilder
sb.append(str.charAt(i-count));
count ++;
i++;
}
}
}
//返回StringBuilder
return sb.toString();
}
}
|
|