程式扎記: [ Java 代碼範本 ] Java 完美判断中文字符

標籤

2013年11月24日 星期日

[ Java 代碼範本 ] Java 完美判断中文字符

來源自 這裡
Preface:
Java判斷一個字符串是否有中文一般情況是利用Unicode編碼 (CJK統一漢字的編碼區間:0x4e00–0x9fbb) 的正則來做判斷,但是其實這個區間來判斷中文不是非常精確,因為有些中文的標點符號比如:,。等等是不能識別的. 底下介紹幾個方法並做簡單測試.

CharUtil 範例:
這邊將方法撰寫在 CharUtil 上的靜態方法:
- CharUtil.java
  1. public class CharUtil {  
  2.     // 根据Unicode编码完美的判断中文汉字和符号  
  3.     public static boolean isChinese(char c) {  
  4.         Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);     
  5.         if (   ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS  
  6.             || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS  
  7.             //|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A  
  8.             //|| ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B  
  9.             //|| ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION  
  10.             //|| ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS  
  11.             )  
  12.             //|| ub == Character.UnicodeBlock.GENERAL_PUNCTUATION)   
  13.         {  
  14.                 return true;  
  15.         }  
  16.         return false;  
  17.     }  
  18.       
  19.     // 完整的判断中文汉字和符号  
  20.     public static boolean isChinese(String strName) {  
  21.         char[] ch = strName.toCharArray();  
  22.         for (int i = 0; i < ch.length; i++) {  
  23.             char c = ch[i];  
  24.             if (isChinese(c)) {  
  25.                 return true;  
  26.             }  
  27.         }  
  28.         return false;  
  29.     }  
  30.       
  31.     // 只能判断部分CJK字符(CJK统一汉字)  
  32.     public static boolean isChineseByREG(String str) {  
  33.         if (str == null) {  
  34.             return false;  
  35.         }  
  36.         Pattern pattern = Pattern.compile("[\\u4E00-\\u9FBF]+");  
  37.         return pattern.matcher(str.trim()).find();  
  38.     }  
  39.   
  40.     // 只能判断部分CJK字符(CJK统一汉字)  
  41.     public static boolean isChineseByName(String str) {  
  42.         if (str == null) {  
  43.             return false;  
  44.         }  
  45.         // 大小写不同:\\p 表示包含,\\P 表示不包含  
  46.         // \\p{Cn} 的意思为 Unicode 中未被定义字符的编码,\\P{Cn} 就表示 Unicode中已经被定义字符的编码  
  47.         String reg = "\\p{InCJK Unified Ideographs}&&\\P{Cn}";  
  48.         Pattern pattern = Pattern.compile(reg);  
  49.         return pattern.matcher(str.trim()).find();  
  50.     }  
  51. }  
測試代碼:
接著底下是測試代碼:
  1. public static void main(String[] args) {      
  2.     String[] strArr = new String[] { "www.micmiu.com",  
  3.                                       "!@#$%^&*()_+{}[]|\"'?/:;<>,.",   
  4.                                       "!¥……()——:;“”‘’《》,。?、",   
  5.                                       "中文不要啊",  
  6.                                       "やめて",   
  7.                                       "韩佳人",   
  8.                                       "한가인" };  
  9.     for (String str : strArr) {  
  10.         System.out.println("=========== 測試字符字串: " + str);  
  11.         System.out.println("正則判斷: " + isChineseByREG(str) + ", "  
  12.                     + isChineseByName(str));  
  13.         System.out.println("Unicode 判斷結果:" + isChinese(str));  
  14.         System.out.println("詳細判斷列表:");  
  15.         char[] ch = str.toCharArray();  
  16.         for (int i = 0; i < ch.length; i++) {  
  17.                 char c = ch[i];  
  18.                 System.out.println(c + " : " + (isChinese(c) ? "是" : "否"));  
  19.         }  
  20.     }  
  21. }  
執行結果:
=========== 測試字符字串: 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 判斷結果:false
詳細判斷列表:
! : 否
¥ : 否
… : 否
… : 否
( : 否
) : 否
— : 否
— : 否
: : 否
; : 否
“ : 否
” : 否
‘ : 否
’ : 否
《 : 否
》 : 否
, : 否
。 : 否
? : 否
、 : 否
=========== 測試字符字串: 中文不要啊
正則判斷: true, false
Unicode 判斷結果:true
詳細判斷列表:
中 : 是
文 : 是
不 : 是
要 : 是
啊 : 是
=========== 測試字符字串: やめて
正則判斷: false, false
Unicode 判斷結果:false
詳細判斷列表:
や : 否
め : 否
て : 否
=========== 測試字符字串: 韩佳人
正則判斷: true, false
Unicode 判斷結果:true
詳細判斷列表:
韩 : 是
佳 : 是
人 : 是
=========== 測試字符字串: 한가인
正則判斷: false, false
Unicode 判斷結果:false
詳細判斷列表:
한 : 否
가 : 否
인 : 否 

1 則留言:

網誌存檔

關於我自己

我的相片
Where there is a will, there is a way!