首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 判斷字符是否為中文的三種高效實現方案

     編輯:Java 相關知識

業務場景

表單驗證、內容過濾、敏感詞檢測、中文分詞預處理等場景常需判斷字串是否包含中文或純中文。

方案一:Unicode 區間判斷(最基礎)

CJK 統一漢字基本區:U+4E00 ~ U+9FBF(含 20,902 字)。

public static boolean hasChineseByRange(String str) {
    if (str == null) return false;
    for (char c : str.toCharArray())
        if (c >= 0x4E00 && c <= 0x9FBF) return true;
    return false;
}

public static boolean isChineseByRange(String str) {
    if (str == null) return false;
    for (char c : str.toCharArray())
        if (c < 0x4E00 || c > 0x9FBF) return false;
    return true;
}

缺點:不含中文標點、擴展區、生僻字。

方案二:正則表達式(推薦:效能與可讀性平衡)

private static final Pattern CHINESE_PATTERN = Pattern.compile("[\\u4E00-\\u9FBF]");

public static boolean hasChineseByReg(String str) {
    return str != null && CHINESE_PATTERN.matcher(str).find();
}

public static boolean isChineseByReg(String str) {
    return str != null && CHINESE_PATTERN.matcher(str).matches();
}

優點:編譯器優化、代碼極簡、效能優於手寫迴圈。

方案三:Character.UnicodeBlock 完整覆蓋(最嚴謹)

涵蓋所有 CJK 區塊:基本區、擴展 A/B/C/D、相容區、符號標點、半全形等。

public static boolean isChinese(char c) {
    Character.UnicodeBlock ub = Character.UnicodeBlock.of(c);
    return ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS
        || ub == Character.UnicodeBlock.CJK_COMPATIBILITY_IDEOGRAPHS
        || ub == Character.UnicodeBlock.CJK_SYMBOLS_AND_PUNCTUATION
        || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_A
        || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_B
        || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_C
        || ub == Character.UnicodeBlock.CJK_UNIFIED_IDEOGRAPHS_EXTENSION_D
        || ub == Character.UnicodeBlock.GENERAL_PUNCTUATION
        || ub == Character.UnicodeBlock.HALFWIDTH_AND_FULLWIDTH_FORMS;
}

public static boolean hasChinese(String str) {
    if (str == null) return false;
    for (char c : str.toCharArray()) if (isChinese(c)) return true;
    return false;
}

public static boolean isChinese(String str) {
    if (str == null) return false;
    for (char c : str.toCharArray()) if (!isChinese(c)) return false;
    return true;
}

測試對照表

測試字串含中文(區間)純中文(區間)含中文(UnicodeBlock)純中文(UnicodeBlock)
Hello否否否否
你好中國是是是是
你好,中國。是否(標點不在區間)是是(含標點)
한글否否否否
ひらがな否否否否
蒼老師(繁體)是是是是

選型建議

  1. 僅需判斷「是否含漢字」,正則方案二效能最佳、代碼最少。
  2. 需精確識別「純中文含標點」,使用 方案三 UnicodeBlock。
  3. 極高頻調用(百萬級/秒),可將方案一優化為 switch 表或查表法(boolean[65536])。

補充:補充字元

Java char 為 UTF-16 代碼單元,無法直接處理補充平面字元(如 𠮷 U+20BB7)。若需支援,請用 codePointAt 遍歷 int 碼點並配合 Character.UnicodeBlock.of(int)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved