Java 完美判断中文字符

原文链接http://www.micmiu.com/lang/java/java-check-chinese/

Java判断一个字符串是否有中文一般情况是利用Unicode编码(CJK统一汉字的编码区间:0x4e00–0x9fbb)的正则来做判断,但是其实这个区间来判断中文不是非常精确,因为有些中文的标点符号比如:,。等等是不能识别的。

以下是比较完善的判断方法:CharUtil.java

1 package com.micmiu.utils;
2  
3 import java.util.regex.Pattern;
4  
5 /**
6  * 字符通用工具类
7  *
8  * @author <a href="http://www.micmiu.com">Michael Sun</a>
9  */
10 public class CharUtil {
11  
12     /**
13      * @param args
14      */
15     public static void main(String[] args) {
16         String[] strArr = new String[] { "www.micmiu.com",
17                 "!@#$%^&*()_+{}[]|\"'?/:;<>,.""!¥……()——:;“”‘’《》,。?、""不要啊",
18                 "やめて""韩佳人""한가인" };
19         for (String str : strArr) {
20             System.out.println("===========> 测试字符串:" + str);
21             System.out.println("正则判断:" + isChineseByREG(str) + " -- "
22                     + isChineseByName(str));
23             System.out.println("Unicode判断结果 :" + isChinese(str));
24             System.out.println("详细判断列表:");
25             char[] ch = str.toCharArray();
26             for (int i = 0; i < ch.length; i++) {
27                 char c = ch[i];
28                 System.out.println(c + " --> " + (isChinese(c) ? "是" "否"));
29             }
30         }
31  
32     }
33  
34     // 根据Unicode编码完美的判断中文汉字和符号
35     private static boolean isChinese(char c) {
36         Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
37         if (ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
38                 || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
39                 || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
40                 || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
41                 || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
42                 || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS
43                 || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION) {
44             return true;
45         }
46         return false;
47     }
48  
49     // 完整的判断中文汉字和符号
50     public static boolean isChinese(String strName) {
51         char[] ch = strName.toCharArray();
52         for (int i = 0; i < ch.length; i++) {
53             char c = ch[i];
54             if (isChinese(c)) {
55                 return true;
56             }
57         }
58         return false;
59     }
60  
61     // 只能判断部分CJK字符(CJK统一汉字)
62     public static boolean isChineseByREG(String str) {
63         if (str == null) {
64             return false;
65         }
66         Pattern pattern = Pattern.compile("[\\u4E00-\\u9FBF]+");
67         return pattern.matcher(str.trim()).find();
68     }
69  
70     // 只能判断部分CJK字符(CJK统一汉字)
71     public static boolean isChineseByName(String str) {
72         if (str == null) {
73             return false;
74         }
75         // 大小写不同:\\p 表示包含,\\P 表示不包含
76         // \\p{Cn} 的意思为 Unicode 中未被定义字符的编码,\\P{Cn} 就表示 Unicode中已经被定义字符的编码
77         String reg = "\\p{InCJK Unified Ideographs}&&\\P{Cn}";
78         Pattern pattern = Pattern.compile(reg);
79         return pattern.matcher(str.trim()).find();
80     }
81 }

运行结果如下:

===========> 测试字符串:www.micmiu.com
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
w --> 否
w --> 否
w --> 否
. --> 否
m --> 否
i --> 否
c --> 否
m --> 否
i --> 否
u --> 否
. --> 否
c --> 否
o --> 否
m --> 否
===========> 测试字符串:!@#$%^&*()_+{}[]|"'?/:;<>,.
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
! --> 否
@ --> 否
# --> 否
$ --> 否
% --> 否
^ --> 否
& --> 否
* --> 否
( --> 否
) --> 否
_ --> 否
+ --> 否
{ --> 否
} --> 否
[ --> 否
] --> 否
| --> 否
" --> 否
' --> 否
? --> 否
/ --> 否
: --> 否
; --> 否
< --> 否
> --> 否
, --> 否
. --> 否
===========> 测试字符串:!¥……()——:;“”‘’《》,。?、
正则判断:false -- false
Unicode判断结果 :true
详细判断列表:
! --> 是
¥ --> 是
… --> 是
… --> 是
( --> 是
) --> 是
— --> 是
— --> 是
: --> 是
; --> 是
“ --> 是
” --> 是
‘ --> 是
’ --> 是
《 --> 是
》 --> 是
, --> 是
。 --> 是
? --> 是
、 --> 是
===========> 测试字符串:不要啊
正则判断:true -- false
Unicode判断结果 :true
详细判断列表:
不 --> 是
要 --> 是
啊 --> 是
===========> 测试字符串:やめて
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
や --> 否
め --> 否
て --> 否
===========> 测试字符串:韩佳人
正则判断:true -- false
Unicode判断结果 :true
详细判断列表:
韩 --> 是
佳 --> 是
人 --> 是
===========> 测试字符串:한가인
正则判断:false -- false
Unicode判断结果 :false
详细判断列表:
한 --> 否
가 --> 否
인 --> 否
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值