截断中文

转自:http://topic.youkuaiyun.com/u/20101013/21/635d6d03-558e-42e9-a535-f74de6bd0033.html?r=69123088




//GBK
public static String cutString(String str,int length) throws Exception{
int count=0,i=0;
for(;i<length&&count<length;i++,count++){
if(String.valueOf(str.charAt(i)).matches("[^//x00-//xff]")){
count++;
}
}
return new String(str.toCharArray(),0,i);
}

//UTF-8
*截取前n个字符的简单实现。Java中使用代码点表示通常意义的字符,即获取前n个代码点。
  */
  static String getTopNCodePoint(String str, int n) {
StringReader sr = new StringReader(str);
StringBuffer dist = new StringBuffer();
// 代码点数量
int count = 0;
// 读入的代码单元
int ch = 0;
try {
while (count < n && (ch = sr.read()) != -1) {
char a = (char) ch;
dist.append(a);
// 大部分常见汉字都可用一个char表示
// 通常情况下,代码单元分三种:普通、高代理、低代理
// 具体参考UTF-16规范 http://tools.ietf.org/html/rfc2781
if (Character.isHighSurrogate(a)) {
// 如果此代码点为高代理,则紧接的代码单元是低代理,将后一个代码单元直接读入,不再处理。
dist.append((char) sr.read());
}
count++;
}
} catch (IOException e) {
e.printStackTrace();
}
return dist.toString();
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值