含有中英文的字符串截取

页面中很多情况下会遇到要截取字符串的情况,但是中文和英文所占的长度不同会造成
[quote]中文:一二三四五六七八九十
字母:abcdefghij
[/quote]
同样是截取10个字符串的长度,中英文的显示却会是很别扭的结果
N久前找过一个截取的,不过因为没有留下记录找不到了...
百度看到的方法还是觉得有点恶心,所以就自己写了一个
实现原理很简单,就是截取字符串,查看每个字符所占字节

//截取字符串长度(中文2个字节,半个中文显示一个)
public static String subTextString(String str,int len){
if(str.length()<len/2)return str;
int count = 0;
StringBuffer sb = new StringBuffer();
String[] ss = str.split("");
for(int i=1;i<ss.length;i++){
count+=ss[i].getBytes().length>1?2:1;
sb.append(ss[i]);
if(count>=len)break;
}
//不需要显示...的可以直接return sb.toString();
return (sb.toString().length()<str.length())?sb.append("...").toString():str;
}


比较特别的地方是
[quote]ss[i].getBytes().length
这部分的结果数字和字母是1,而中文是3(我的工程是UTF-8编码)[/quote]

根据这个特性来区分字母数字和汉字
[quote]System.out.println(subTextString("aa你1好2你好", 6));
结果:aa你1好...[/quote]
其实这部分显示的是7个字节的数据另外还有3个点,如果要完善的话还需要计算截取后的字符串+3以后是否和原有字符串长度相同
如遇到这种情况,应该就没有必要再去截取了(抛砖,详细的实现代码略)
[quote]这个是我的测试字符串
这个是我的测试字符...
[/quote]

关于使用方法,我是用的自定义标签在jsp中调用的tld标签(WEB-INF目录下建一个tld文件夹)
文件ss.tld

<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">

<description>SubString tool</description>
<display-name>test core</display-name>
<tlib-version>1.1</tlib-version>
<short-name>ss</short-name>
<tag>
<name>subString</name>
<tag-class>com.test.tag.SubStringTag</tag-class>
<body-content>empty</body-content>
<attribute>
<name>value</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>String</type>
</attribute>
<attribute>
<name>len</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
<type>Integer</type>
</attribute>
</tag>

</taglib>


项目中创建tld标签对应的java文件(路径即前面tld里面写的com.test.tag.SubStringTag)

import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

/**
* 截取字符串长度
*/
public class SubStringTag extends TagSupport {
private Integer len;
private String value;

public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public Integer getLen() {
return len;
}
public void setLen(Integer len) {
this.len = len;
}
@Override
public int doStartTag() throws JspException {
return SKIP_BODY;
}
@Override
public int doEndTag() throws JspException {
try {
//此处调用的是最前面的截取方法
pageContext.getOut().print(StringUtil.subTextString(value, len));
} catch (IOException e) {
throw new JspTagException(e.getMessage());
}
return EVAL_PAGE;
}
}


JSP页面中调用截取方法
[quote]
首先引入自定义标签
<%@ taglib prefix="ss" uri="/WEB-INF/tld/ss.tld"%>

len value 这两个属性是在前面tld文件中定义的属性,分别代表字符串和截取长度
<a href="xxx.do?id=${id}" title="${name}">
<ss:subString len="22" value="${name}"/>
</a>
[/quote]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值