含有中英文的字符串截取
程序员文章站
2022-05-24 23:29:42
...
页面中很多情况下会遇到要截取字符串的情况,但是中文和英文所占的长度不同会造成
同样是截取10个字符串的长度,中英文的显示却会是很别扭的结果
N久前找过一个截取的,不过因为没有留下记录找不到了...
百度看到的方法还是觉得有点恶心,所以就自己写了一个
实现原理很简单,就是截取字符串,查看每个字符所占字节
比较特别的地方是
根据这个特性来区分字母数字和汉字
其实这部分显示的是7个字节的数据另外还有3个点,如果要完善的话还需要计算截取后的字符串+3以后是否和原有字符串长度相同
如遇到这种情况,应该就没有必要再去截取了(抛砖,详细的实现代码略)
关于使用方法,我是用的自定义标签在jsp中调用的tld标签(WEB-INF目录下建一个tld文件夹)
文件ss.tld
项目中创建tld标签对应的java文件(路径即前面tld里面写的com.test.tag.SubStringTag)
JSP页面中调用截取方法
首先引入自定义标签
<%@ 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>
引用
中文:一二三四五六七八九十
字母:abcdefghij
字母:abcdefghij
同样是截取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; }
比较特别的地方是
引用
ss[i].getBytes().length
这部分的结果数字和字母是1,而中文是3(我的工程是UTF-8编码)
这部分的结果数字和字母是1,而中文是3(我的工程是UTF-8编码)
根据这个特性来区分字母数字和汉字
引用
System.out.println(subTextString("aa你1好2你好", 6));
结果:aa你1好...
结果:aa你1好...
其实这部分显示的是7个字节的数据另外还有3个点,如果要完善的话还需要计算截取后的字符串+3以后是否和原有字符串长度相同
如遇到这种情况,应该就没有必要再去截取了(抛砖,详细的实现代码略)
引用
这个是我的测试字符串
这个是我的测试字符...
这个是我的测试字符...
关于使用方法,我是用的自定义标签在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页面中调用截取方法
引用
首先引入自定义标签
<%@ 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>