我试图弄清楚为什么 JSON 提要中的特殊字符(在浏览器中查看时看起来非常好)在我的 Android 代码中使用时会中断。带有重音符号、省略号、弯引号等字符的字符被其他字符替换——也许将其从 UTF-8 转换为 ASCII?我不确定。我正在使用 GET 请求从服务器中提取 JSON 数据,对其进行解析,将其存储在数据库中,然后使用 Html.fromHtml() 并将内容放在 TextView 中。
问问题
1488 次
1 回答
1
经过大量实验,我缩小了可能性,直到发现问题出在 Ignition HTTP 库 (https://github.com/kaeppler/ignition) 上。具体来说,使用 ignitedHttpResponse.getResponseBodyAsString()
虽然这是一个方便的快捷方式,但那一行会导致字符损坏。相反,我现在使用:
InputStream contentStream = ignitedHttpResponse.getResponseBody();
String content = Util.inputStreamToString(contentStream);
public static String inputStreamToString(InputStream is) throws IOException {
String line = "";
StringBuilder total = new StringBuilder();
// Wrap a BufferedReader around the InputStream
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
// Read response until the end
while ((line = rd.readLine()) != null) {
total.append(line);
}
// Return full string
return total.toString();
}
编辑:添加更多细节
这是重现该问题的最小测试用例。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test);
activity = this;
instance = this;
String url = SaveConstants.URL;
IgnitedHttpRequest request = new IgnitedHttp(activity).get(url);
InputStream contentStream = null;
try {
IgnitedHttpResponse response = request.send();
String badContent = response.getResponseBodyAsString();
int start = badContent.indexOf("is Texas");
Log.e(TAG, "bad content: " + badContent.substring(start, start + 10));
contentStream = response.getResponseBody();
String goodContent = Util.inputStreamToString(contentStream);
start = goodContent.indexOf("is Texas");
Log.e(TAG, "good content: " + goodContent.substring(start, start + 10));
} catch (IOException ioe) {
Log.e(TAG, "error", ioe);
}
}
在日志中:
坏内容:是德克萨斯吗?好内容:是德克萨斯吗?</p>
更新:要么我疯了,要么问题只出现在客户的生产提要中,而不是他们的开发提要中,尽管在浏览器中查看时内容看起来相同 - 显示“德克萨斯”。因此,可能需要一些不稳定的服务器配置才能导致此问题......但是,当它发生时,解决此问题的方法正如我所概述的那样。我不推荐使用 response.getResponseBodyAsString();
于 2012-06-22T15:08:09.273 回答