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
相关产品推荐
相关产品推荐

