在頁面中顯示某字段時(shí),字段值過長會(huì)導(dǎo)致頁面樣式錯(cuò)亂,這時(shí)候我們需要對值進(jìn)行截取,當(dāng)截取值時(shí)會(huì)碰到以下問題:
1、如果按字符截取會(huì)導(dǎo)致中英文顯示的長度不一
2、如果按字節(jié)截取可能會(huì)導(dǎo)致最后一個(gè)中文截成兩部分
以下代碼是在網(wǎng)上獲取并經(jīng)過改造而成,能夠很好的解決上面兩個(gè)問題
/**
* 根據(jù)指定字節(jié)數(shù)截取字符串,當(dāng)指定處為中文第一個(gè)字節(jié)時(shí)少截取一個(gè)字符,當(dāng)長度大于指定截取長度時(shí),截取后在字符串末尾追加指定字符串<br/>
* 這里添加了字符串的編碼,因?yàn)轫撁娴木幋a不同,字符串所占字節(jié)也不同
*
* @param str 待截取字符串,如果為null或者"",則立即返回str
* @param length 需要截取的長度
* @param endStr 截取后末尾追加的字符串
* @param charset 待截取字符串的編碼
* @return
*/
public String subStringByByte(String str, int length, String endStr, String charset) {
if (str == null || "".equals(str.trim()) || length <= 0) {
return str;
}
try {
int strlen = str.getBytes(charset).length;// 這里要和頁面的編碼相關(guān)
if (strlen < length) return str;
Pattern p = Pattern.compile("^[""u4e00-""u9fa5]$");
int i = 0, j = 0;
int sublength = length - ((endStr == null) ? 0 : endStr.getBytes(charset).length);
for (char c : str.toCharArray()) {
Matcher m = p.matcher(String.valueOf(c));
i += m.find() ? 2 : 1;
++j;
if (i == sublength) break;
if (i > sublength) {
--j;
break;
}
}
return str.substring(0, j) + endStr;
} catch (UnsupportedEncodingException e) {
return str;
}
}