開(kāi)發(fā)中經(jīng)常遇到,字符串過(guò)長(zhǎng),無(wú)法完全顯示的問(wèn)題
這時(shí)候就需要截取我們所需要的長(zhǎng)度,后面顯示省略號(hào)或其他字符。
由于中文字符占兩個(gè)字節(jié),而英文字符占用一個(gè)字節(jié),所以,單純地判斷字符數(shù),效果往往不盡如人意
下面的方法通過(guò)判斷字符的類(lèi)型來(lái)進(jìn)行截取,效果還算可以:)
如果大家有其他的解決方法歡迎貼出來(lái),共同學(xué)習(xí):)
**********************************************************************
private String str;
private int counterOfDoubleByte;
private byte b[];
/**
* 設(shè)置需要被限制長(zhǎng)度的字符串
* @param str 需要被限制長(zhǎng)度的字符串
*/
public void setLimitLengthString(String str){
? this.str = str;
}
/**
* @param len 需要顯示的長(zhǎng)度(<font color="red">注意:長(zhǎng)度是以byte為單位的,一個(gè)漢字是2個(gè)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;
}
本文轉(zhuǎn)貼自網(wǎng)友:focus2004 的文章
#?re: 精確截取字符串(轉(zhuǎn)載) 2006-01-28 18:24
大作拜讀,有一點(diǎn)愚見(jiàn),特拋磚引玉:
1。字符串除了可以基于byte[]操作外,還可以基于char[]操作。看老大你的意圖是想截取字符串的前幾個(gè)字符然后加上省略符號(hào)最后輸出而已,完全不必考慮用byte[]數(shù)組操作啊 。而且好像開(kāi)發(fā)中更注重語(yǔ)義上的第幾個(gè)字符而不是你說(shuō)的這種情況哦。
2。以下是拙作,請(qǐng)斧正:
/**
* 字符串截取函數(shù)
* @param str String 要處理的字符串
* @param length int 需要顯示的長(zhǎng)度
* @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;
//如果字符串的位數(shù)小于等于要截取的位數(shù),附加上表示省略的信息的字符串后返回
if (str.length() <= length) {
return str + symbol;
//從零開(kāi)始,截取length個(gè)字符,附加上表示省略的信息的字符串后返回
} 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;
}
}??
呵呵 tdg 兄很認(rèn)真喔,談不上斧正。主要是這個(gè)問(wèn)題,用 char 處理,如果是字母或者數(shù)字,實(shí)際上截取出來(lái)的會(huì)比漢字少占用一半的空間,所以截取出來(lái)后,還是不能對(duì)齊。而實(shí)際上 char 數(shù)組中,不管是字母、數(shù)字還是漢字,它們都只代表一個(gè)單元。但是 byte 則不同,字母、數(shù)字只占用一個(gè)字節(jié),而漢字占用兩個(gè)字節(jié)(都是GBK編碼)。??
您好!
你的文章讓我受益不少,有個(gè)問(wèn)題想向您確認(rèn)一下:
在代碼中
b = str.getBytes("GBK");
if(b.length <= len)
return str;
for(int i = 0; i < len; i++){
if(b[i] < 0)
counterOfDoubleByte++;
}
是不是如果只要是中文漢字,在b[i]對(duì)應(yīng)的值都是小于0的,
也就是說(shuō),在漢字代表的兩個(gè)字節(jié)中,這兩個(gè)漢字分別轉(zhuǎn)化為整數(shù)值時(shí),是不是一定小于0,但值范圍不能小于-127的。做過(guò)測(cè)試,不能肯定。:)
istarliu,這里要強(qiáng)調(diào)一下,GBK、GB2312 雙字節(jié)編碼字節(jié)才是負(fù)的。UTF-8 三字節(jié)編碼未去核實(shí)。
來(lái)源