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

Java 字符串與 Unicode 相互轉換工具類實現

     編輯:Java 相關知識

背景

Java 內部以 UTF-16 存儲字符,但某些場景(如屬性文件、網絡傳輸)需將字符串轉為 \uXXXX 形式的 Unicode 轉義序列。JDK 自帶 native2ascii 工具,代碼層面也可輕鬆實現雙向轉換。

核心工具類

public final class UnicodeUtils {

    private UnicodeUtils() {} // 工具類禁止實例化

    /** 字符串 → Unicode 轉義 (\uXXXX) */
    public static String toUnicode(String str) {
        if (str == null) return null;
        StringBuilder sb = new StringBuilder(str.length() * 6);
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            sb.append("\\u").append(String.format("%04x", (int) c));
        }
        return sb.toString();
    }

    /** Unicode 轉義 → 字符串 */
    public static String fromUnicode(String unicode) {
        if (unicode == null) return null;
        StringBuilder sb = new StringBuilder();
        String[] parts = unicode.split("\\\\u");
        for (int i = 1; i < parts.length; i++) { // parts[0] 通常為空
            int codePoint = Integer.parseInt(parts[i].substring(0, 4), 16);
            sb.append((char) codePoint);
            if (parts[i].length() > 4) sb.append(parts[i].substring(4)); // 處理非轉義字符
        }
        return sb.toString();
    }

    // 測試
    public static void main(String[] args) {
        String original = "最代碼網站地址:www.zuidaima.com";
        String unicode = toUnicode(original);
        String restored = fromUnicode(unicode);
        System.out.println("Unicode: " + unicode);
        System.out.println("Restored: " + restored);
        System.out.println("Equal: " + original.equals(restored));
    }
}

輸出示例

Unicode: \u6700\u4ee3\u7801\u7f51\u7ad9\u5730\u5740\u3a\u77\u77\u77\u2e\u7a\u75\u69\u64\u61\u69\u6d\u61\u2e\u63\u6f\u6d
Restored: 最代碼網站地址:www.zuidaima.com
Equal: true

關鍵點解析

  • 補零格式化:%04x 確保 4 位十六進制(如 \u0061 而非 \u61)。
  • split("\\\\u"):雙重轉義匹配字面 \u;parts[0] 為空字符串故從 1 開始。
  • 補碼處理:僅解析前 4 位十六進制,剩餘字符直接追加,兼容混合字符串。
  • 性能優化:預估容量 str.length() * 6 減少擴容;用 StringBuilder 而非 StringBuffer(無同步開銷)。

擴展:補碼點 完整支持

上述實現僅處理 BMP 平面字符(char)。若需支持 Emoji 等補充字符(代碼點 > 0xFFFF),需用 codePointAt / Character.toChars:

public static String toUnicodeFull(String str) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < str.length(); ) {
        int cp = str.codePointAt(i);
        sb.append(String.format("\\u{%x}", cp)); // Unicode 規範大括號寫法
        i += Character.charCount(cp);
    }
    return sb.toString();
}

總結

掌握字符串與 Unicode 轉義互轉,能應對配置文件國際化、日誌脫敏、协议調試等場景。工具類已封裝好邊界情況,可直接引入項目使用。

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