黑马程序员技术交流社区

标题: 从字符串中按字节数截取一部分,但不能截取出半个中文 [打印本页]

作者: songwei    时间: 2015-8-31 14:07
标题: 从字符串中按字节数截取一部分,但不能截取出半个中文
       在做基础测试题的时候,遇到了一个比较麻烦的题目:编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
* 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文。

上网搜了类似题目的解决方法后,我编写的代码如下:


  1. *
  2. * 编写函数,从一个字符串中按字节数截取一部分,但不能截取出半个中文(GBK码表),
  3. * 例如:从“HM程序员”中截取2个字节是“HM”,截取4个则是“HM程”,截取3个字节也要是"HM"而不要出现半个中文
  4. *
  5. *
  6. *
  7. */
  8. public class Test10 {
  9.        
  10.         public static void main(String[] args) throws Exception{
  11.                
  12.                 String str = "HM程序员";
  13.                
  14.                 getSubString(str, 2);//截取2个字节
  15.                 getSubString(str, 3);//截取3个字节
  16.                 getSubString(str, 4);//截取4个字节
  17.         }

  18.        
  19.         //从字符串中按字节数截取一部分,但不会截取出半个中文(GBK码表)
  20.         private static void getSubString(String str, int len) throws Exception{
  21.                
  22.                 int charsNumber = len;//先让截取的子串字符数等于参数中的字节数
  23.                
  24.                 String subStr = str.substring(0, charsNumber); //截取角标从0到charsNumber的子串
  25.                
  26.                 int bytesNumber = subStr.getBytes("GBK").length; //以GBK表编码子串,获取字节数
  27.                
  28.                 while(!(len >= bytesNumber)){ //按题中要求,子串必须符合: "所要截取的字节数" >= "最终截取子串所具有的字节数"
  29.                        
  30.                         charsNumber=charsNumber-1;//子串字符数减一,重新从头往后截取
  31.                         subStr = str.substring(0, charsNumber);
  32.                         bytesNumber = subStr.getBytes("GBK").length;
  33.                 }
  34.                
  35.                 System.out.println("截取"+len+"个字节:"+subStr); //打印结果
  36.         }

  37. }
复制代码

作者: songwei    时间: 2015-8-31 14:10
自己给自己顶一个,PS:技术分如何获取啊??
作者: vipsong    时间: 2015-8-31 15:12
  1. package com.itheima.test;

  2. import java.io.IOException;


  3. public class CutStringDemo {

  4.     public static void main(String[] args) throws IOException {
  5.         String string = "ab你cd好";
  6.         int length1 = string.getBytes("UTF-8").length;
  7.         for (int x = 0; x < length1; x++) {
  8.             System.out.println("UTF-8截取到第" + (x + 1) + "个字节的内容是:" + CutStringByBytesUTF8(string, x + 1));
  9.         }
  10.        
  11.         int length2 = string.getBytes("GBK").length;
  12.         for (int x = 0; x < length2; x++) {
  13.             System.out.println("GBK截取到第" + (x + 1) + "个字节的内容是:" + CutStringByBytes(string, x + 1));
  14.         }

  15.     }
  16.    
  17.     public static String CutStringByBytesUTF8(String string, int len) throws IOException {

  18.         // 将字符串转换成字节数组
  19.         byte[] buf = string.getBytes("UTF-8");

  20.         int count = 0;

  21.         for (int i = len - 1; i >= 0; i--) {//从最后的角标开始取值
  22.             if (buf[i] < 0)
  23.                 count++;
  24.             else // 判断,如果截取到的字节不小于零,就不用判断了。
  25.                 break;
  26.         }
  27.         if (count % 3 == 0) {
  28.             return new String(buf, 0, len, "UTF-8");
  29.         } else if(count % 3 == 1 ){
  30.             return new String(buf, 0, len - 1, "UTF-8");
  31.         }else {
  32.             return new String(buf, 0, len - 2, "UTF-8");
  33.         }

  34.     }
  35.    
  36.    
  37.    
  38.    

  39.     public static String CutStringByBytes(String string, int len) throws IOException {

  40.         // 将字符串转换成字节数组
  41.         byte[] buf = string.getBytes("GBK");

  42.         int count = 0;

  43.         for (int i = len - 1; i >= 0; i--) {//从最后的角标开始取值
  44.             if (buf[i] < 0)
  45.                 count++;
  46.             else // 判断,如果截取到的字节不小于零,就不用判断了。
  47.                 break;
  48.         }
  49.         if (count % 2 == 0) {
  50.             return new String(buf, 0, len, "GBK");
  51.         } else {
  52.             return new String(buf, 0, len - 1, "GBK");
  53.         }

  54.     }
  55. }
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2