算法思路
1.先按照實(shí)際要截取的字節(jié)長(zhǎng)度,復(fù)制一份字節(jié)數(shù)組
2.轉(zhuǎn)換回字符串,計(jì)算字符長(zhǎng)度resLen,并按這個(gè)長(zhǎng)度截取原字符串
3.計(jì)算截取的字符串的字節(jié)數(shù)是否等于需求長(zhǎng)度len,相等則直接返回,不相等,則在resLen的基礎(chǔ)上減1再截取,則為需要的結(jié)果
此算法截取的結(jié)果為向前截取,即保證最終截取的字節(jié)長(zhǎng)度不能超過需求長(zhǎng)度len,比如gbk字符集,"一二三四五",截取3字節(jié),結(jié)果應(yīng)為"一",實(shí)際長(zhǎng)度為2字節(jié),第3個(gè)字節(jié)為半個(gè)中文,屬于無效字符,需要去掉。
在轉(zhuǎn)換字節(jié)數(shù)組時(shí),需要指定字符集,在不同的字符集下,轉(zhuǎn)換出來的字節(jié)數(shù)組長(zhǎng)度是不一樣的。
經(jīng)測(cè)試,效率要高于按循環(huán)的算法,尤其在截取長(zhǎng)度較大時(shí),性能較優(yōu)
代碼
public static String substr(String str, int len,
String cs) throws UnsupportedEncodingException {
byte[] br = new byte[len];
byte[] bt = str.getBytes(cs);
System.arraycopy(bt, 0, br, 0, len);
String res = new String(br, cs);
int resLen = res.length();
if (str.substring(0, resLen).getBytes(cs).length > len) {
res = str.substring(0, resLen - 1);
}
return res;
}