我正在试图弄清楚为什么JSON Feed中的特殊字符(在浏览器中查看时看起来完全正常)会在我的Android代码中使用时中断。带有重音符号,省略号字符,卷曲引号字符等的字符被其他字符替换 - 也许将其从UTF-8翻译为ASCII?我不确定。我正在使用GET请求从服务器提取JSON数据,解析它,将其存储在数据库中,然后使用Html.fromHtml()并将内容放在TextView中。
答案 0 :(得分: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);
}
}
在日志中:
糟糕的内容:德克萨斯州的好内容:是德克萨斯州的
更新:要么我疯了,要么问题只发生在客户的生产Feed中,而不是他们的开发Feed,尽管在浏览器中查看时内容看起来相同 - 显示“Texas” “”。所以也许有一些不稳定的服务器配置需要导致这个问题...但是,当它出现时,这个问题的解决方案就像我概述的那样。我不建议使用response.getResponseBodyAsString();