首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android JSON 解析:`\u4eca\u5929` Unicode 轉義字串轉中文的正確姿勢

     編輯:程式設計綜合問答

現象

百度翻譯 API 回傳 JSON 中文欄位為 Unicode 轉義:`"dst": "\u4eca\u5929"`(即「今天」)。直接 `getString("dst")` 得到的字串字面包含反斜線與 u,非真正中文字元。

原因

JSON 標準允許 `\uXXXX` 表示 Unicode 碼位。Java `org.json.JSONObject` / `Gson` / `Moshi` / `Jackson` **預設在解析時自動將 `\uXXXX` 解碼為對應字元**。若看到原始反斜線,通常是:

  1. 未經過 JSON 解析器,直接對原始 HTTP 回應字串操作(如 `substring`、`split`)。
  2. 使用的解析器未啟用 Unicode 解碼(極少見)。
  3. 雙重編碼:伺服器先將中文轉 `\uXXXX`,再將整個 JSON 字串再次編碼(如 URL Encode 或再次 JSON 字串化)。

正確處理流程

// 1. 取得原始回應字串 (已確保 UTF-8 解碼)
String response = ...; // 來自 OkHttp/Volley/Retrofit 的 response.body().string()

// 2. 使用標準 JSON 庫解析
JSONObject json = new JSONObject(response); // org.json
// 或 Gson
// JsonObject json = JsonParser.parseString(response).getAsJsonObject();

// 3. 直接取得字串,已自動轉碼
String dst = json.getString("dst"); // "今天"
Log.d("TAG", dst);

若必須手動處理原始轉義字串

// Apache Commons Text (推薦)
String unescaped = StringEscapeUtils.unescapeJava(jsonRaw); // 需引入 commons-text

// 或手寫簡易版 (僅處理 \uXXXX)
public static String unescapeUnicode(String s) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < s.length(); ) {
        if (s.startsWith("\\u", i) && i + 5 < s.length()) {
            int code = Integer.parseInt(s.substring(i + 2, i + 6), 16);
            sb.append((char) code);
            i += 6;
        } else {
            sb.append(s.charAt(i++));
        }
    }
    return sb.toString();
}

避坑提醒

  • 網路請求務必指定 `Accept-Charset: UTF-8`,回應體用 `string()` 而非 `bytes()` 手動解碼。
  • Retrofit + Gson/Moshi 預設自動處理,無需額外代碼。
  • Logcat 顯示可能因字型缺失顯示方框,實際字串已正確。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved