MyException - 我的异常网
当前位置:我的异常网» 编程 » 带有中英文的字符串截取

带有中英文的字符串截取

www.MyException.Cn  网友分享于:2013-02-20  浏览:10次
含有中英文的字符串截取
页面中很多情况下会遇到要截取字符串的情况,但是中文和英文所占的长度不同会造成
引用
中文:一二三四五六七八九十
字母: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编码)


根据这个特性来区分字母数字和汉字
引用
System.out.println(subTextString("aa你1好2你好", 6));
结果: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>

1 楼 QiuQiu0034 2013-02-03  
很简单的一个正则就可以了,不用大动干戈再写个tag
str.replaceAll("(.{10}).*", "$1...")
2 楼 happysoul 2013-02-04  
QiuQiu0034 写道
很简单的一个正则就可以了,不用大动干戈再写个tag
str.replaceAll("(.{10}).*", "$1...")

使用场景在第一行写明了,对于咨询或者其他需要有标题的网站,如果是截取10个字的话就是下面的样子,这里必须要指定汉字占2位,字母是1位
引用
中文:一二三四五六七八九十...
应该:abcdefghijklmnopqrst...
字母:abcdefghij...


另外简单的截取功能早就有标签可以实现
<%@tablib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
${fn:substring("要截取的字符串"),beginIndex,endIndex}
3 楼 suyulin6688 2013-02-04  
这个还是挺实用的。
4 楼 wangqiuyi 2013-02-04  
这个截字 还是不是很准确 各个字所占的宽度 还是不一样的 一个汉字并没有二个字母的宽度 比如说w W
5 楼 happysoul 2013-02-04  
wangqiuyi 写道
这个截字 还是不是很准确 各个字所占的宽度 还是不一样的 一个汉字并没有二个字母的宽度 比如说w W

这个就需要你选用等宽字体的字母和数字用于前台显示了
具体哪种我就不记得了~ 这部分直接告诉美工我的英文和数字要等宽 就可以了
重要的是:程序不可能解决所有问题,很多都是要有人为约束在里面的
就好像页面填写年龄的地方你非要写中文的 三十
我想不可能会有人去迁就用户再给他转成数字 30

文章评论

软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有