開發中經常遇到,字符串過長,無法完全顯示的問題

這時候就需要截取我們所需要的長度,后面顯示省略號或其他字符。

由于中文字符占兩個字節,而英文字符占用一個字節,所以,單純地判斷字符數,效果往往不盡如人意

下面的方法通過判斷字符的類型來進行截取,效果還算可以:)


如果大家有其他的解決方法歡迎貼出來,共同學習:)
**********************************************************************
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的。做過測試,不能肯定。:)