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

Java Unicode 轉中文:\\uXXXX 反序列化核心邏輯與工具類封裝

     編輯:Java 相關知識

應用場景

  • 讀取 .properties 配置文件(ISO-8859-1 編碼存儲中文)
  • 解析 JSON/\uXXXX 編碼的前端傳輸數據
  • 處理資料庫中存儲的 Unicode 轉義字符串
  • 日誌系統中可讀化異常堆棧中的 Unicode

核心算法

public class UnicodeCodec {
    /**
     * 將 \\uXXXX 形式字符串還原為中文
     * @param unicodeStr 如 "\\u4e2d\\u6587" 或 "中文"
     * @return 解碼後字符串
     */
    public static String unicodeToChinese(String unicodeStr) {
        if (unicodeStr == null || unicodeStr.isEmpty()) return unicodeStr;
        
        StringBuilder sb = new StringBuilder();
        int i = 0;
        int len = unicodeStr.length();
        while (i < len) {
            char c = unicodeStr.charAt(i);
            // 檢測 \\uXXXX 模式
            if (c == '\\' && i + 5 < len && unicodeStr.charAt(i + 1) == 'u') {
                String hex = unicodeStr.substring(i + 2, i + 6);
                try {
                    int codePoint = Integer.parseInt(hex, 16);
                    sb.append((char) codePoint);
                    i += 6;
                    continue;
                } catch (NumberFormatException e) {
                    // 非法十六進制,按原樣輸出
                }
            }
            sb.append(c);
            i++;
        }
        return sb.toString();
    }

    /** 反向:中文轉 \\uXXXX(非 ASCII 字符轉義) */
    public static String chineseToUnicode(String str) {
        if (str == null) return null;
        StringBuilder sb = new StringBuilder();
        for (char c : str.toCharArray()) {
            if (c > 0x7F) { // 非 ASCII
                sb.append(String.format("\\u%04x", (int) c));
            } else {
                sb.append(c);
            }
        }
        return sb.toString();
    }
}

JDK 內置方案 (推薦生產使用)

import java.util.Properties;
import java.io.StringReader;

public class JdkUnicodeDecode {
    /** 利用 Properties 原生支援 \\uXXXX 解析 */
    public static String decode(String s) {
        try {
            Properties props = new Properties();
            props.load(new StringReader("x=" + s)); // key 隨意
            return props.getProperty("x");
        } catch (Exception e) {
            return s; // 解析失敗返回原串
        }
    }
}

Apache Commons Text 方案 (企業級)

import org.apache.commons.text.StringEscapeUtils;

// 解碼 \\uXXXX、\\n、\\t 等標準轉義
String decoded = StringEscapeUtils.unescapeJava(encoded);

// 編碼為 \\uXXXX
String encoded = StringEscapeUtils.escapeJava(chinese);

測試驗證

public static void main(String[] args) {
    String encoded = "\\u4e2d\\u6587\\u6d4b\\u8bd5"; // "中文測試"
    System.out.println("手寫解碼: " + UnicodeCodec.unicodeToChinese(encoded));
    System.out.println("Properties: " + JdkUnicodeDecode.decode(encoded));
    System.out.println("CommonsText: " + StringEscapeUtils.unescapeJava(encoded));
    // 均輸出: 中文測試

    String chinese = "你好世界";
    System.out.println("手寫編碼: " + UnicodeCodec.chineseToUnicode(chinese));
    System.out.println("CommonsText: " + StringEscapeUtils.escapeJava(chinese));
    // 輸出: \\u4f60\\u597d\\u4e16\\u754c
}

性能對比 (100 萬次循環)

方案耗時備註
手寫解析~120ms無依賴、邏輯可控
Properties.load~350msJDK 內置、臨時對象多
Commons Text~90ms高度優化、功能全

總結

Unicode ↔ 中文轉換三大路徑:手寫解析器(零依賴、教學/受限環境)、Properties.load(JDK 內置、臨時用)、Commons Text(生產首選、高性能、全轉義支援)。核心邏輯均為 掃描 \\uXXXX → 十六進制解析 → char 組裝。選型原則:有第三方庫許可 → Commons Text;無依賴限制 → 手寫/Properties。

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