昨天做了个很小的练习题,需要实现的功能是截取含有汉字的字符串,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'之间.请高手斧正.