昨天做了个很小的练习题,需要实现的功能是截取含有汉字的字符串,java是采用unicode的编码格式,所以一个汉字是占用两个字节空间.需要实现的功能是,假如有个字符串是"你好你好",需要截取长度是4,则截取结果是"你好",如果字符串是"你好A你好",需要截取长度是6,则不截取最后一个汉字"你",截取结果是"你好A".我个人用了个比较土的方法,网上有人是用正则表达式来匹配.
    源码如下:
public class TestSplitString {

   /**
    * @param args
    */

   public static void main(String[] args) {
    String str = "你好啊";
     int a = 2;
    System.out.println(splitString(str, a));
    str = "你很a好";
    a = 6;
    System.out.println(splitString(str, a));
    str = "abcdefg";
    a = 7;
    System.out.println(splitString(str, a));
  }

   private static String splitString(String str, int a) {
     if (str != null && str.trim().length() > 0 && a > 0) {
       // 取得该字符串的字节长度
       int length = str.getBytes().length;
       // 全部不包括汉字
       if (str.length() == length) {
         // 如果截取长度是字符串长度以内,就substring,否则就取这个字符串
         if (a < str.length()) {
           return str.substring(0, a);
        } else {
           return str;
        }
      } // 含有汉字
       else {
        StringBuffer sb = new StringBuffer();
         // 截取算法 遍历字符串,并且监测a值
         for ( int i = 0; i < str.length() && a > 0; i++) {
           // 如果是汉字算2个长度。
           if (str.charAt(i) >= '\u4E00' && str.charAt(i) <= '\u9FA5') {
             // 如果是汉字且不是最后一个字符,就加上,否则不加
             if (a > 1) {
              sb.append(str.charAt(i));
              a -= 2;
            }
             // 不是汉字只算一个长度
          } else {
            sb.append(str.charAt(i));
            a--;
          }
        }
         return sb.toString();
      }
    }
     return "输入有误";
  }
}
 
  这里就是在JAVA中汉字是在'\u4E00'和'\9FA5'之间.请高手斧正.