跳至主要内容

Java 漢字辨別

Java 判斷是否只為漢字

  • regex:
    • A: 常用中文漢字
      • \u9fa5 舊式範例,列到 Big5 編碼中最後一個繁體中文常用字
      • \u9fff 新式範例的常見漢字,含繁體簡體,僅列到 CJK Ideographs (中日韓統一漢字)區段的結尾字元
      • 仍有部分古字、生僻字未列入
    • B: 所有 Unicode 漢字,包含 Extension

regex

    String regex_A = "[\\u4e00-\\u9fff]+";

String regex_B = "[\\p{IsHan}]+";

example

  • 此範例匹配所有 Unicode 定義中的 漢字 ,包含 簡體、繁體 、甚至一些偏僻字
    public static void main(String[] args) {
String input = "許功蓋";

// String regex = "[\\u4e00-\\u9fff]+";
String regex = "[\\p{IsHan}]+";
Pattern pattern = Pattern.compile(regex);
System.out.println(input );
System.out.println(" is Han? " + pattern.matcher(input).matches());

}

Java Encoding 與 Unicode

  • Java 所有字串在記憶體中都是使用 UTF-16 編碼儲存
  • 無論輸入來源的檔案或資料是 UTF-8、ISO-8859-1、Big5 還是其他編碼,只要它被正確解碼為 Java 的 String,那麼你就可以用上述方法檢查中文字元
    • 反之,來源內容以錯誤的 Encoding 判別,因為錯誤的解碼方式,那無論如何都會得到錯誤結果

繁體與檢體中文判別

  • 繁體中文與簡體中文在 Unicode 中是共用同一組漢字碼位(code point, code position),所以無法直接區分。
    • 若搭配字集,則可約略比對出常用部分。(無法百分之百成功判別)
    • 需指定繁體字集,排除指定簡體字集內容來達到不完美效果。
    String regex = "[\\u4e00-\\u9fff&&[^簡體排除區間]]+"

其他

 //全形標點 。、《》
[\u3000-\u303F\uFF01-\uFF60]+

//全形英數與符號(全形字元) !?
[\uFF01-\uFF60\uFFE0-\uFFE6\uFF10-\uFF5A\uFF21-\uFF3A\uFF41-\uFF5A]+