开发中经常遇到,字符串过长,无法完全显示的问题

这时候就需要截取我们所需要的长度,后面显示省略号或其他字符。

由于中文字符占两个字节,而英文字符占用一个字节,所以,单纯地判断字符数,效果往往不尽如人意

下面的方法通过判断字符的类型来进行截取,效果还算可以:)


如果大家有其他的解决方法欢迎贴出来,共同学习:)
**********************************************************************
private String str;
private int counterOfDoubleByte;
private byte b[];
/**
* 设置需要被限制长度的字符串
* @param str 需要被限制长度的字符串
*/
public void setLimitLengthString(String str){
  this.str = str;
}
/**
* @param len 需要显示的长度(<font color="red">注意:长度是以byte为单位的,一个汉字是2个byte</font>)
* @param symbol 用于表示省略的信息的字符,如“...”,“>>>”等。
* @return 返回处理后的字符串
*/
public String getLimitLengthString(int len, String symbol) throws UnsupportedEncodingException {
  counterOfDoubleByte = 0;
  b = str.getBytes("GBK");
  if(b.length <= len)
    return str;
  for(int i = 0; i < len; i++){
    if(b[i] < 0)
      counterOfDoubleByte++;
  }

  if(counterOfDoubleByte % 2 == 0)
    return new String(b, 0, len, "GBK") + symbol;
  else
    return new String(b, 0, len - 1, "GBK") + symbol;
}


本文转贴自网友:focus2004 的文章
posted on 2005-08-12 15:39 Rosen 阅读(963) 评论(6)  编辑 收藏收藏至365Key 所属分类: J2EE 技术

评论

#  re: 精确截取字符串(转载) 2005-08-19 08:27 ivan
if(b<0) 编译会出错。  回复
  

#  re: 精确截取字符串(转载) 2005-08-19 20:39 Rosen
马上修改一下代码,去年转贴的时候一直忘记修改了。
是 if(b[i] < 0),谢谢 ivan 指正。  回复
  

#  re: 精确截取字符串(转载) 2006-01-28 18:24 tdg
大作拜读,有一点愚见,特抛砖引玉:
1。字符串除了可以基于byte[]操作外,还可以基于char[]操作。看老大你的意图是想截取字符串的前几个字符然后加上省略符号最后输出而已,完全不必考虑用byte[]数组操作啊 。而且好像开发中更注重语义上的第几个字符而不是你说的这种情况哦。
2。以下是拙作,请斧正:
/**
* 字符串截取函数
* @param str String 要处理的字符串
* @param length int 需要显示的长度
* @param symbol String 用于表示省略的信息的字符,如“...”,“>>>”等
* @return String 返回处理后的字符串
* @throws UnsupportedEncodingException
*/
public String getLimitLengthString(String str, int length, String symbol) throws
UnsupportedEncodingException {
assert str != null;
assert length > 0;
assert symbol != null;
//如果字符串的位数小于等于要截取的位数,附加上表示省略的信息的字符串后返回
if (str.length() <= length) {
return str + symbol;
//从零开始,截取length个字符,附加上表示省略的信息的字符串后返回
} else {
str = new String(str.getBytes("GBK"));
char[] charArray = str.toCharArray();
char[] charArrayDesc = new char[length];
System.arraycopy(charArray, 0, charArrayDesc, 0, length);
return new String(charArrayDesc) + symbol;
}
}  回复
  

#  re: 精确截取字符串(转载) 2006-01-28 20:03 Rosen
呵呵 tdg 兄很认真喔,谈不上斧正。主要是这个问题,用 char 处理,如果是字母或者数字,实际上截取出来的会比汉字少占用一半的空间,所以截取出来后,还是不能对齐。而实际上 char 数组中,不管是字母、数字还是汉字,它们都只代表一个单元。但是 byte 则不同,字母、数字只占用一个字节,而汉字占用两个字节(都是GBK编码)。  回复
  

#  re: 精确截取字符串(转载) 2006-03-24 10:49 istarliu
您好!
你的文章让我受益不少,有个问题想向您确认一下:
在代码中
b = str.getBytes("GBK");
if(b.length <= len)
return str;
for(int i = 0; i < len; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
是不是如果只要是中文汉字,在b[i]对应的值都是小于0的,
也就是说,在汉字代表的两个字节中,这两个汉字分别转化为整数值时,是不是一定小于0,但值范围不能小于-127的。做过测试,不能肯定。:)