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

Java 檢測字符串是否包含中文及 Unicode 編碼區間完整指南

     編輯:Java 相關知識

Java 中文檢測與字符編碼核心知識

在處理文本數據時,判斷字符串是否包含中文字符是常見需求。本文提供從簡單正則到完整編碼轉換的多種方案,並附贈常用字符的 Unicode 編碼區間參考表。

一、核心方案:正則表達式匹配

1.1 最簡潔的檢測方法


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
    }
}

1.2 擴展:檢測所有 CJK 字符

基本區間 \u4e00-\u9fa5 只覆蓋常用漢字,完整 CJK 統一表意文字需擴展:


// 更全面的中日韓字符範圍
private static final Pattern CJK_PATTERN = Pattern.compile(
    "[\u4e00-\u9fff\u3400-\u4dbf\u20000-\u2a6df\u2a700-\u2b73f\u2b740-\u2b81f\u2b820-\u2ceaf]"
);

二、進階方案:中文轉 Unicode 轉義序列

適用於需要將中文轉為 \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;
    }
}

四、Unicode 編碼區間速查表

字符類別十六進制區間十進制區間說明
基本漢字4E00 - 9FA519968 - 40869常用漢字 20,902 個
擴展 A 區3400 - 4DBF13312 - 19967罕用漢字 6,582 個
擴展 B 區20000 - 2A6DF131072 - 173791超大字符集
數字 0-90030 - 003948 - 57ASCII 數字
大寫字母0041 - 005A65 - 90A-Z
小寫字母0061 - 007A97 - 122a-z
全角符號FF01 - FF5E65281 - 65374全角標點/字母/數字
中文標點3000 - 303F12288 - 12351、。!?《》「」等

五、性能優化建議

  1. 預編譯 Pattern:靜態常量編譯正則,避免重複編譯
  2. 字符遍歷優於正則:簡單判斷時 charAt 遍歷比正則快 3-5 倍
  3. 避免創建臨時對象:循環中複用 StringBuilder、Matcher
  4. 大數據量並行處理:使用 parallelStream 或分塊處理

六、工具庫推薦

  • Apache Commons Lang:StringUtils.containsAny(str, "中文") 需自定義字符集
  • ICU4J:IBM 開源,最完整的 Unicode 支持,支持 Script 判斷 UScript.HAN
  • Google Guava:CharMatcher.inRange('\u4e00', '\u9fa5')

根據業務場景選擇合適方案:簡單判斷用正則預編譯,高性能場景用字符遍歷,複雜文本分析引入 ICU4J。

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