判断中文字符(最近一道面试题,答案)

一、http://hilliate.blog.hexun.com/11600190_d.html

 

String.getBytes().length != String.length()

String.getBytes().length取的是字节数,因为中文是全角字符,所以每个中文的字节数都为2

String.length()取的是字符长度,按中文的个数来截取。

但是这样有bug  因为中文是全角字符没错,但是并非全角字符就全部是中文

另外的解决方法如下:

  String   str   =   "中国chinese";  
  for(int   i   =0   ;i   <   str.length()   ;   i   ++)  
  {  
  System.out.println(str.substring(i,   i+1).matches("[\\u4e00-\\u9fa5]+"));  
  }  

这是取的中文在Unicode中的编码区间,而且将字符中的每一个substring都拿出来与字符区间相比

最终很容易判断出字符中是否有中文。

 

二、http://blog.csdn.net/zhengjianqi/archive/2008/07/04/2612385.aspx

package test;  
 
 
 
import java.util.Random;  
 
 
 
public class IsChineseOrEnglish {  
 
    //  GENERAL_PUNCTUATION 判断中文的“号  
 
    //  CJK_SYMBOLS_AND_PUNCTUATION 判断中文的。号  
 
    //  HALFWIDTH_AND_FULLWIDTH_FORMS 判断中文的,号  
 
    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;  
 
    }  
 
 
 
    public static void isChinese(String strName) {  
 
        char[] ch = strName.toCharArray();  
 
        for (int i = 0; i < ch.length; i++) {  
 
            char c = ch[i];  
 
            if (isChinese(c) == true) {  
 
                System.out.println(isChinese(c));  
 
                return;  
 
            } else {  
 
                System.out.println(isChinese(c));  
 
                return;  
 
            }  
 
        }  
 
    }  
 
    public static void main(String[] args) {  
 
        Random r = new Random();  
 
        for(int i=0;i<20;i++)  
 
        System.out.println(r.nextInt(10)+1);  
 
        isChinese("き");  
 
        isChinese("中国");  
 
    }  
 
 
 
}

 

三、http://topic.csdn.net/t/20040512/16/3059368.html

1)JAVA

自己写的珍藏代码:  
  /**  
            *   用getBytes(encoding):返回字符串的一个byte数组  
            *   当b[0]为   63时,应该是转码错误  
            *   A、不乱码的汉字字符串:  
            *   1、encoding用GB2312时,每byte是负数;  
            *   2、encoding用ISO8859_1时,b[i]全是63。  
            *   B、乱码的汉字字符串:  
            *   1、encoding用ISO8859_1时,每byte也是负数;  
            *   2、encoding用GB2312时,b[i]大部分是63。  
            *   C、英文字符串  
            *   1、encoding用ISO8859_1和GB2312时,每byte都大于0;  
            *   <p/>  
            *   总结:给定一个字符串,用getBytes("iso8859_1")  
            *   1、如果b[i]有63,不用转码;   A-2  
            *   2、如果b[i]全大于0,那么为英文字符串,不用转码;   B-1  
            *   3、如果b[i]有小于0的,那么已经乱码,要转码。   C-1  
            */  
          private   static   String   toGb2312(String   str)   {  
                  if   (str   ==   null)   return   null;  
                  String   retStr   =   str;  
                  byte   b[];  
                  try   {  
                          b   =   str.getBytes("ISO8859_1");  
   
                          for   (int   i   =   0;   i   <   b.length;   i++)   {  
                                  byte   b1   =   b[i];  
                                  if   (b1   ==   63)  
                                          break;     //1  
                                  else   if   (b1   >   0)  
                                          continue;//2  
                                  else   if   (b1   <   0)   {         //不可能为0,0为字符串结束符  
                                          retStr   =   new   String(b,   "GB2312");  
                                          break;  
                                  }  
                          }  
                  }   catch   (UnsupportedEncodingException   e)   {  
                          //   e.printStackTrace();     //To   change   body   of   catch   statement   use   File   |   Settings   |   File   Templates.  
                  }  
                  return   retStr;  
          }

 

2)JS

用javascript不是很好解决吗?  
  <script   language="JavaScript">  
  if   (/[^\x00-\xff]/g.test(this.value))   {  
      alert('为汉字!');  
  }else{  
      alert('非汉字!');  
  }  
  </script>

3)、思路:首先判断一个字节的asc码,如果大于127,则判断紧接着的下一个字节,如果还大于127,则这两个字节就是一个汉字(未验证)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值