在處理文本數據時,判斷字符串是否包含中文字符是常見需求。本文提供從簡單正則到完整編碼轉換的多種方案,並附贈常用字符的 Unicode 編碼區間參考表。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
public class ChineseDetector {
// 中文 Unicode 區間:\u4e00-\u9fa5(基本漢字)
private static final Pattern CHINESE_PATTERN = Pattern.compile("[\u4e00-\u9fa5]");
/**
* 判斷字符串是否包含中文
* @param str 待檢測字符串
* @return true 包含中文,false 不包含
*/
public static boolean containsChinese(String str) {
if (str == null || str.isEmpty()) {
return false;
}
Matcher matcher = CHINESE_PATTERN.matcher(str);
return matcher.find();
}
public static void main(String[] args) {
System.out.println(containsChinese("Hello 世界")); // true
System.out.println(containsChinese("Hello World")); // false
System.out.println(containsChinese("")); // false
System.out.println(containsChinese(null)); // false
}
}
基本區間 \u4e00-\u9fa5 只覆蓋常用漢字,完整 CJK 統一表意文字需擴展:
// 更全面的中日韓字符範圍
private static final Pattern CJK_PATTERN = Pattern.compile(
"[\u4e00-\u9fff\u3400-\u4dbf\u20000-\u2a6df\u2a700-\u2b73f\u2b740-\u2b81f\u2b820-\u2ceaf]"
);
適用於需要將中文轉為 \uXXXX 格式的場景(如屬性文件生成、前端傳輸)。
public class ChineseToUnicode {
/**
* 將字符串中的中文轉為 Unicode 轉義序列
* @param input 原始字符串
* @return 轉換後字符串,如 "中文" -> "\u4e2d\u6587"
*/
public static String toUnicodeEscape(String input) {
if (input == null) return null;
StringBuilder result = new StringBuilder();
for (char c : input.toCharArray()) {
if (c >= 0x4e00 && c <= 0x9fa5) { // 基本漢字區間
result.append(String.format("\\u%04x", (int) c));
} else {
result.append(c);
}
}
return result.toString();
}
/**
* 反向轉換:Unicode 轉義序列還原為字符
*/
public static String fromUnicodeEscape(String escaped) {
if (escaped == null) return null;
// 簡單實現,實際項目建議使用 Apache Commons Text StringEscapeUtils
return escaped.replaceAll("\\\\u([0-9a-fA-F]{4})",
m -> String.valueOf((char) Integer.parseInt(m.group(1), 16)));
}
}
public class ChineseAnalyzer {
/**
* 統計字符串中中文字符數量
*/
public static int countChineseChars(String str) {
if (str == null) return 0;
int count = 0;
for (char c : str.toCharArray()) {
if (isChineseChar(c)) count++;
}
return count;
}
/**
* 提取所有中文字符
*/
public static String extractChinese(String str) {
if (str == null) return "";
StringBuilder sb = new StringBuilder();
for (char c : str.toCharArray()) {
if (isChineseChar(c)) sb.append(c);
}
return sb.toString();
}
private static boolean isChineseChar(char c) {
// 基本漢字區間
return c >= 0x4e00 && c <= 0x9fa5;
}
}
| 字符類別 | 十六進制區間 | 十進制區間 | 說明 |
|---|---|---|---|
| 基本漢字 | 4E00 - 9FA5 | 19968 - 40869 | 常用漢字 20,902 個 |
| 擴展 A 區 | 3400 - 4DBF | 13312 - 19967 | 罕用漢字 6,582 個 |
| 擴展 B 區 | 20000 - 2A6DF | 131072 - 173791 | 超大字符集 |
| 數字 0-9 | 0030 - 0039 | 48 - 57 | ASCII 數字 |
| 大寫字母 | 0041 - 005A | 65 - 90 | A-Z |
| 小寫字母 | 0061 - 007A | 97 - 122 | a-z |
| 全角符號 | FF01 - FF5E | 65281 - 65374 | 全角標點/字母/數字 |
| 中文標點 | 3000 - 303F | 12288 - 12351 | 、。!?《》「」等 |
charAt 遍歷比正則快 3-5 倍StringBuilder、MatcherparallelStream 或分塊處理StringUtils.containsAny(str, "中文") 需自定義字符集UScript.HANCharMatcher.inRange('\u4e00', '\u9fa5')根據業務場景選擇合適方案:簡單判斷用正則預編譯,高性能場景用字符遍歷,複雜文本分析引入 ICU4J。