Java判断输入的String是否为中文方法总结

今天遇到的问题是如何判断输入的字符串是汉字,现将学习到的方法转载、记录总结如下:

Java用的是Unicode 编码char 型变量的范围是0-65535 无符号的值,可以表示 65536个字符,基本上地球上的字符可被全部包括了,实际中,我们希望判断一个字符是不是汉字,或者一个字符串里的字符是否有汉字来满足业务上的需求,String类中有个这样的方法可得到其字符长度length() ,看下面例子, 

Java代码   收藏代码
  1. String s1 = "我是中国人";  
  2. String s2 = "imchinese";  
  3. String s3 = "im中国人";  
  4. System.out.println(s1+":"+new String(s1).length());  
  5. System.out.println(s2+":"+new String(s2).length());   
  6. System.out.println(s3+":"+new String(s3).length());  


OUTPUT: 
我是中国人:5 
imchinese:9 
im中国人:5 
看到了吧,字符串里如果有双字节的字符java就把每个字符都按双字节编码,如果都是单字节的字符就按单字节编码 
于是按照以上的规律,结合一位QQ昵称 ?G茶?I珠海 兄的提示由以下解决方法,就是判断字符串的长度和字符字节的长度是否相同来判断是否有双字节的字符 
Java代码   收藏代码
  1. System.out.println((s1.getBytes().length == s1.length())?"s1无汉字":"s1有汉字");  
  2. System.out.println((s2.getBytes().length == s2.length())?"s2无汉字":"s2有汉字");  
  3. System.out.println((s3.getBytes().length == s3.length())?"s3无汉字":"s3有汉字");  


OUTPUT: 
s1有汉字 
s2无汉字 
s3有汉字 // 
且慢,这样诚然可以判断出来一个串中是否有双字节编码的字符,但是要精确判断是否有汉字就有些麻烦了,我们知道还有许多其他国家的字符在Unicode中是双字节的. 

于是,需要进一步确定汉字的编码范围怎么确定呢,我用了一个本办法那就是现在记事本输出0-65535之间的字符,通过观察发现第一个汉字是'一'最后一个是'??'(现在我也不认识);这下好了判断汉字就容易多了比如我们可以通过比较字符的编码范围,最后给大家一些我试验的结果汉字基本集中在[19968,40869]之间,共有20901个汉字(是不是少了点,算算你能认识多少) 

/**
 * 判断该字符串是否为中文
 * @param string
 * @return
 */
public static boolean isChinese(String string){
    int n = 0;
    for(int i = 0; i < string.length(); i++) {
        n = (int)string.charAt(i);
        if(!(19968 <= n && n <40869)) {
            return false;
        }
    }
    return true;
}

顺便记录一些编码范围:

unicode编码范围:
汉字:[0x4e00,0x9fa5](或十进制[19968,40869])
数字:[0x30,0x39](或十进制[48, 57])
小写字母:[0x61,0x7a](或十进制[97, 122])
大写字母:[0x41,0x5a](或十进制[65, 90])
ASCII表见:
http://home.educities.edu.tw/wanker742126/asm/ap04.html
unicode中文范围
http://www.iteye.com/topic/558050
汉字编码范围:\u4e00-\u9FA5

双字节字符编码范围:\u0391-\uFFE5

双字节字符编码范围

1. GBK (GB2312/GB18030)
/x00-/xff GBK双字节编码范围
/x20-/x7f ASCII
/xa1-/xff 中文 gb2312
/x80-/xff 中文 gbk

2. UTF-8 (Unicode)

/u4e00-/u9fa5 (中文)
/x3130-/x318F (韩文
/xAC00-/xD7A3 (韩文)
/u0800-/u4e00 (日文)


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拭心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值