日期:2014-05-20  浏览次数:20843 次

java非英文字符串截取的问题(包括简繁中文,日本等双字节编码)
项目中需要显示不同编码的文字,由于页面显示要求,当字符串长度超过60时需要截取后加...,英文状态下肯定没问题了,就是在简繁中文,日文这种双字节文字显示时截取需要判断是否截取到整个字而不是它的一半,查了相关资料只有以下类似的方法
private String subString(String src, int length) {
  byte[] s = src.getBytes();
  int flag = 0;
  for (int i = 0; i < length; ++i) {
  if (s[i] < 0)
  flag++;
  }
  if (flag % 2 != 0)
  length--;
  byte[] d = new byte[length];
  System.arraycopy(s, 0, d, 0, length);
  return new String(d);
  }
问题在于开发的操作系统是英文版的,如果仅仅执行byte[] s = src.getBytes();的话会依据本机的encode值将src(中文)转成乱码,这种情况下根本就没有判断出是否是中文字;但是如果又约定byte[] s = src.getBytes("GBK");又不能按预计的处理繁体或日本字。不知道大家有没有好的办法处理,我想在getbytes()时根据src的字符集来设,就是不知如何得到src的字符集。
谢谢

------解决方案--------------------
我一直在用的一个方法,没发现问题,里面的GBK编码可能需要你自己根据需要修改了。
Java code
  /**
   * 返回指定字节长度的字符串
   * 
   * @param str String 字符串
   * @param length int 指定长度
   * @return String 返回的字符串
   */
  public static String toLength(String str, int length) {
    if (str == null) {
      return null;
    }
    if (length <= 0) {
      return "";
    }
    try {
      if (str.getBytes("GBK").length <= length) {
        return str;
      }
    } catch (Exception ex) {
    }
    StringBuffer buff = new StringBuffer();

    int index = 0;
    char c;
    length -= 3;
    while (length > 0) {
      c = str.charAt(index);
      if (c < 128) {
        length--;
      } else {
        length--;
        length--;
      }
      buff.append(c);
      index++;
    }
    buff.append("...");
    return buff.toString();
  }

------解决方案--------------------
你们说的长度是指 字节长度吧

但我不明白1楼的程序为什么要 length -= 3; 然后又 buff.append("...");



------解决方案--------------------
可以用正则表达式来判断输入字符是否是双字节字符,如果是双字节字符就+2,否则就+1

正则表达式是:

提取信息中的双字节字符串 (汉字):
[^\x00-\xff]*
------解决方案--------------------
Java code
public class Test {

    public static void main(String[] args) {
        String str2 = "abcdefghijklmnopq";
        String str1 = "abcdefghijklmnop";        
        String str3 = "abcdefghijklmno";
        String str4 = "一二三四五六七八九十一二三四五六";
        String str5 = "一二三四五六七八";
        String str6 = "一二三四五六七";
        String str7 = "一二三a四五六七八九十一二三四五六";
        String append = " ...";
        System.out.println(trancate(str1, 16, append));        
        System.out.println(trancate(str2, 16, append));
        System.out.println(trancate(str3, 16, append));
        System.out.println(trancate(str4, 16, append));
        System.out.println(trancate(str5, 16, append));
        System.out.println(trancate(str6, 16, append));
        System.out.println(trancate(str7, 16, append));
    }

    private static String trancate(String src, int length) {
        return trancate(src, length, "");
    }
    
    private static String trancate(String src, int length, String append) {
        int len = 0;
        char[] chars = src.toCharArray();
        StringBuffer sb = new StringBuffer();
        int i = 0;
        while(len < length) {
            if(i >= chars.length) {
                return sb.toString();
            }
            sb.append(chars[i]);
            if(chars[i++] > 0xff) {
                len += 2;                
            }else{
                len++;
            }
        }        
        if(sb.toString().equals(src)) {
            return sb.toString();
        }else{
            sb.append(append);
            return sb.toString();
        }        
    }
}

------解决方案--------------------