JAVA识别字符串是数字(英文)还是汉字,web页面进行字符截断的帮助类

public static void main(String[] args) {
    //长度是2说明是英文/数字/英文状态下的字符,长度为4说明是汉字/中文状态下的字符
    String str = "测试2s-+¥2#";
    for(int i=0; i<str.length(); i++){
        System.out.println("[" + str.charAt(i) + "]的长度为:" + Integer.toHexString(str.charAt(i)).length());
    }
}

运行结果:

[测]的长度为:4
[试]的长度为:4
[2]的长度为:2
[s]的长度为:2
[-]的长度为:2
[+]的长度为:2
[¥]的长度为:4
[2]的长度为:2
[#]的长度为:2

针对这个原理可以解决页面上有固定宽度的显示区域,但显示区域的内容超长并且有中英文混合,需要进行截断显示(其实也可以采用css处理,但是有些地方css处理会有兼容性的问题)。

特写如下帮助类:

  1 /*  3  * Author:   yangzhilong
  4  * Date:     2016年8月25日 下午1:44:36
  5  * Description: //模块目的、功能描述      
  6  * History: //修改记录
  7  * <author>      <time>      <version>    <desc>
  8  * 修改人姓名             修改时间            版本号                  描述
  9  */
 10 import org.apache.commons.lang3.StringUtils;
 11 
 12 /**
 13  * 〈一句话功能简述〉<br> 
 14  * 〈功能详细描述〉
 15  *
 16  * @author yangzhilong
 17  * @see [相关类/方法](可选)
 18  * @since [产品/模块版本] (可选)
 19  */
 20 public class StringSubstringUtils {
 21     
 22     private static enum MODEL{UP, DOWN};
 23 
 24     /**
 25      * 功能描述: <br>
 26      * 〈功能详细描述〉
 27      *
 28      * @param args
 29      * @throws Exception 
 30      * @see [相关类/方法](可选)
 31      * @since [产品/模块版本](可选)
 32      */
 33     public static void main(String[] args) throws Exception {
 34         String str = "测试哈2哈ek";
 35         //4个汉字的宽度
 36         System.out.println(substrByByteLength(str, 16, MODEL.DOWN));
 37         //4个汉字的宽度
 38         System.out.println(substrByByteLength(str, 16, MODEL.UP));
 39         
 40         //4个汉字加一个英文的宽度
 41         System.out.println(substrByByteLength(str, 18, MODEL.DOWN));
 42         //4个汉字加一个英文的宽度
 43         System.out.println(substrByByteLength(str, 18, MODEL.UP));
 44         
 45         //5个汉字的宽度
 46         System.out.println(substrByByteLength(str, 20, MODEL.DOWN));
 47         //5个汉字的宽度
 48         System.out.println(substrByByteLength(str, 20, MODEL.UP));
 49     }
 50     
 51     /**
 52      * 
 53      * 功能描述: <br>
 54      * 截图字符串的指定字节长度
 55      *
 56      * @param str
 57      * @param length  字节长度,必须为2的整数倍
 58      * @param model  截取模式,例如截图的地方是一个汉字(4个长度),是保留这个汉字还是不要,UP为保留,DOWN为不保留
 59      * @return
 60      * @throws Exception
 61      * @see [相关类/方法](可选)
 62      * @since [产品/模块版本](可选)
 63      */
 64     public static String substrByByteLength(String str, int length, MODEL model) throws Exception{
 65         if(StringUtils.isBlank(str)){
 66             return str;
 67         }
 68         if(length <=0){
 69             throw new RuntimeException("length必须大于0");
 70         }
 71         if(length%2 != 0){
 72             throw new RuntimeException("length必须是2的整数倍");
 73         }
 74         int tempLengthCount = 0;
 75         for(int i=0,len=str.length(); i<len; i++){
 76             tempLengthCount += Integer.toHexString(str.charAt(i)).length();
 77             if(tempLengthCount>=length){
 78                 if(tempLengthCount > length){
 79                     switch (model) {
 80                         case UP:
 81                             if(i < (len-1)){
 82                                 return str.substring(0, i+1) + "..";
 83                             }else{
 84                                 return str.substring(0, i+1);
 85                             }
 86                         case DOWN:
 87                             if(i <= (len-1))
 88                                 return str.substring(0, i) + "..";
 89                             else
 90                                 return str.substring(0, i);
 91                     }
 92                 }else{
 93                     if(i < (len-1)){
 94                         return str.substring(0, i+1) + "..";
 95                     }else{
 96                         return str.substring(0, i+1);
 97                     }
 98                 }
 99             }
100         }        
101         return str;
102     }
103 }

运行结果如下:

测试哈2..
测试哈2哈..
测试哈2哈..
测试哈2哈..
测试哈2哈e..
测试哈2哈e..
原文地址:https://www.cnblogs.com/yangzhilong/p/5806507.html