You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android应用解码维基百科API返回外文编码文本失败求助

解决维基百科API希腊语文本解码问题

问题根源

你遇到的不是URL编码或Base64编码问题,返回文本里的\uXXXX是JSON标准的Unicode转义序列,用来表示希腊语等非ASCII字符。之前用URLDecoder或Base64解码完全不对路,所以才会失败。

正确解决方案

直接用JSON解析器处理整个响应,解析器会自动处理Unicode转义,不需要手动解码。Android里可以用系统自带的JSONObject,或者第三方库如Gson、Moshi。

方法1:使用Android原生JSONObject

// 假设response是从API获取的完整JSON字符串
try {
    JSONObject jsonResponse = new JSONObject(response);
    JSONObject queryObj = jsonResponse.getJSONObject("query");
    JSONObject pagesObj = queryObj.getJSONObject("pages");
    // 遍历pages里的条目(titles可能返回多个,这里取第一个)
    Iterator<String> pageKeys = pagesObj.keys();
    if (pageKeys.hasNext()) {
        String pageId = pageKeys.next();
        JSONObject pageObj = pagesObj.getJSONObject(pageId);
        String articleText = pageObj.getString("extract");
        // 这里的articleText已经是解码后的希腊语文本,直接使用即可
        Log.d("DecodedText", articleText);
    }
} catch (JSONException e) {
    e.printStackTrace();
}

方法2:使用Gson库(更简洁)

先在build.gradle里添加依赖:

implementation 'com.google.code.gson:gson:2.10.1'

然后通过Gson解析响应:

Gson gson = new Gson();
Map<String, Object> responseMap = gson.fromJson(response, new TypeToken<Map<String, Object>>() {}.getType());
Map<String, Object> queryMap = (Map<String, Object>) responseMap.get("query");
Map<String, Object> pagesMap = (Map<String, Object>) queryMap.get("pages");
// 取第一个页面的extract内容
for (Map.Entry<String, Object> entry : pagesMap.entrySet()) {
    Map<String, Object> pageMap = (Map<String, Object>) entry.getValue();
    String articleText = (String) pageMap.get("extract");
    Log.d("DecodedText", articleText);
    break;
}

为什么之前的方法失败

  • URLDecoder.decode():仅处理URL编码字符(如%CE%B4格式),但API返回的是JSON转义序列,因此无效。
  • Base64解码:返回文本并非Base64编码内容,包含\等非Base64合法字符,必然抛出非法字符异常。

内容的提问来源于stack exchange,提问作者stavros.3p

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 14:15:41