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..