表單驗證、內容過濾、敏感詞檢測、中文分詞預處理等場景常需判斷字串是否包含中文或純中文。
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();
}
優點:編譯器優化、代碼極簡、效能優於手寫迴圈。
涵蓋所有 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 | 否 | 否 | 否 | 否 |
| 你好中國 | 是 | 是 | 是 | 是 |
| 你好,中國。 | 是 | 否(標點不在區間) | 是 | 是(含標點) |
| 한글 | 否 | 否 | 否 | 否 |
| ひらがな | 否 | 否 | 否 | 否 |
| 蒼老師(繁體) | 是 | 是 | 是 | 是 |
switch 表或查表法(boolean[65536])。Java char 為 UTF-16 代碼單元,無法直接處理補充平面字元(如 𠮷 U+20BB7)。若需支援,請用 codePointAt 遍歷 int 碼點並配合 Character.UnicodeBlock.of(int)。