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)。\u;parts[0] 為空字符串故從 1 開始。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 轉義互轉,能應對配置文件國際化、日誌脫敏、协议調試等場景。工具類已封裝好邊界情況,可直接引入項目使用。