中英文截取指定长度的字符,保证不会出乱码,截取最终长度为length,或length-1

package com.luodfu.test;
import java.io.UnsupportedEncodingException;
/**
 * 中英文截取指定长度的字符
 * 一个中文算两个字符,保证不会出乱码
 * 截取最终长度为length,或length-1
 * @author luodongfu
 * @place  hangzhou
 */
public class TestChinese {

 public static void main(String[] args) {
   String aa="A22中z文G测试_英文A看_看";
   System.out.println(subChineseStr(aa,7) );
   System.out.println(subChineseStr(aa,8) );
   System.out.println(subChineseStr(aa,9) );
 }
 
 /**
  * 判断字符是否为中文
  * @param c
  * @return
  */
 public static boolean isChinese(char c) {  
        Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);  
        if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS  
                || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS  
                || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A  
                || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION  
                || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION  
                || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS) {  
            return true;  
        }  
        return false;  
    }  
 
 /**
  * 截取中英文字符中指定长度,保证不会出现乱码。
  * 截取最终长度为length,或length-1.这样就不会出现乱码了,呵呵
  * @param str  被截取的字符串
  * @param length  截取几个长度
  * @return  
  */
    public static String  subChineseStr(String str,int length)
    {  
     if(str==null||str.trim().equals(""))
     {
      return "";
     }
     try {
   if(str.getBytes("GBK").length<=length)
   {
    return str;
   }
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
   return "";
  }
     StringBuffer sb=new StringBuffer();
     int count=0;
        char[] ch = str.toCharArray();  
        for (int i = 0; i < ch.length; i++) {  
            char c = ch[i];  
            if (isChinese(c))
            {  
             if(count<=length-2)
             {
              sb.append(c);
             }
             count=count+2;
            }
            else
            {
             if(count<length)
             {
              sb.append(c);
             }
             count++;
            }
        } 
        return sb.toString();
    }
}

测试结果如下:

A22中z
A22中z文
A22中z文G

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值