- public class Test10 {
- public static void main(String[] args) {
- // 封装键盘录入
- Scanner sc = new Scanner(System.in);
- System.out.println("请给出一串字符串");
- // 接收需要被截取的字符串
- String line = sc.nextLine();
- // 接收需要被截取的字节数
- // 加入了死循环,以便验证
- while (true) {
- System.out.println("请给出需要截取的字节数");
- // 接收字节数
- int len = sc.nextInt();
- // 调用截取方法,并输出返回结果
- System.out.println(subStr(line, len));
- }
- }
- /*
- * 这是按条件截取字符串的方法返回截取完毕的字符串
- */
- public static String subStr(String str, int len) {
- // 定义一个字符串类型的变量,用来接收最终截取结果,并返回
- String data = null;
- // 定义一个int类型的变量,GBK存储中文是以负数并且两个字节存储一个中文
- // count用来统计字符串转换的字节数组从后往前直到存储的字节为正数时负数的个数
- int count = 0;
- try {
- // 将接收的字符串转换为GBK编码的字节数组
- byte[] bys = str.getBytes("GBK");
- // 判断接收的截取条件len是否大于字节数组的长度
- if (bys.length < len) {
- // 大于则直接将字节数组转换为字符串返回
- return new String(bys, "GBK");
- }
- // 反着遍历bys数组,循环条件:数组中存储的元素不为负数
- for (int x = len; bys[x - 1] < 0; x--) {
- // 每循环一次,证明字节数组从后往前存储了一个负数
- count++;
- }
- // 判断count取模2是否为0,为0证明从后往前存储的中文字节是双数,证明可以完整输出
- if (count % 2 == 0) {
- data = new String(bys, 0, len, "GBK");
- // 不为0,则反之,不可以完整输出,那么便-1再输出,即可完整输出
- } else {
- data = new String(bys, 0, len - 1, "GBK");
- }
- } catch (UnsupportedEncodingException e) {
- e.printStackTrace();
- }
- // 返回最终结果
- return data;
- }
- }
复制代码
第十题:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表)例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
|
|