<span style="font-family:Microsoft YaHei;font-size:12px;">/** * 截取要点: * 1. 首先将字符串转换成字节数组,再将字节数组的每个元素拿出来,判断有无负数(一个汉字为两个负数),即可知道有没有汉字 * 2. len:是将字符串转换成字节数组后,要截取的长度,如“我ABC你”的字节数组长度为7(-50,-46,65,66,67,-60,-29) * ,而截取的是6(-50,-46,65,66,67,-60) * 3. 对截取的字节数组(-50,-46,65,66,67,-60),统计负数的个数 * 4. String里的 substring 方法将双字节的汉字当成一个字节的字符(UCS2字符) * * @param str * @param len * @return */ public static String subString(String str, int len) { // 判断字符串是否为空 if (str == null && "".equals(str)) { return null; } // 将字符串中的char数组转换成指定编码方式的byte数组的函数 byte[] strBytes = null; try { strBytes = str.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 得到字符串的长度 int strLen = strBytes.length; // 判断截取字符串的长度是否在判断的范围内,否则返回原串 if (len >= strLen || len < 1) { return str; } // 打印出字符串长度和截取的长度 System.out.println("strBytes.length = " + strBytes.length); System.out.println("len = " + len); int count = 0; for (int i = 0; i < len; i++) { // 将每个字节数组转换为整型数,以为后面根据值的正负来判断是否为汉字 int value = strBytes[i]; // System.out.println("strBytes[" + i + "] = " + strBytes[i] + ","); System.out.println(value + ","); // 我ABC你 -50,-46,65,66,67,-60,-29 // 对于第一种情况: // 注,一个函数转换成整型书就为两个负整数,上面的“我ABC你”,转换成整型数就为 -50,-46,65,66,67,-60,-29 // 但是 len=6,所以截取下来就是 -50,-46,65,66,67,-60,count就为3 // 如果是汉字(负),则统计截取字符串中的汉字所占字节数 if (value < 0) { count++; } System.out.println("汉字字节码的数量为 " + count); } // 依据判断给定的字符串是否含有汉字,利用String类的substring()方法来截取不同的长度 // 根据所统计的字节数,判断截取到字符是否为半个汉字,奇数为半个汉字 if (count % 2 != 0) { // 如果在截取长度为1时,则将该汉字取出,其他情况则不截取(截取字节长度数 - 截取汉字字节数/2 - 截取到的半个汉字的字节数) len = (len == 1) ? len : len - count / 2 - 1; // len=6-3/2-1=4 我ABC // System.out.println("count / 2 = " + count / 2); System.out.println("处理后的len = " + len); } else { // 截取字符长度为字节长度 - 汉字所占字节长度 / 2 (汉字占两个字节) len = len - (count / 2); } return str.substring(0, len); }</span>
<span style="font-family:Microsoft YaHei;font-size:12px;">/** * @param args */ public static void main(String[] args) { // 情况一 System.out.println("------------ 情况一 ------------"); String inStr = "我ABC你"; String str = subString(inStr, 6); System.out.println(str); // 我ABC // 情况二 System.out.println("------------ 情况二 ------------"); inStr = "我ABC汉DEF"; str = subString(inStr, 1); System.out.println(str); // 我 // 情况三 System.out.println("------------ 情况三 ------------"); inStr = "我AB爱孩子CDEF"; str = subString(inStr, 9); System.out.println(str); // 我AB爱孩 // 情况四 System.out.println("------------ 情况四 ------------"); inStr = "ABCDEF"; str = subString(inStr, 4); System.out.println(str); // ABCD }</span>
原文:http://blog.csdn.net/happylee6688/article/details/27839823