HTTP GET响应中的奇怪字符

时间:2012-06-22 15:08:09

标签: android

我正在试图弄清楚为什么JSON Feed中的特殊字符(在浏览器中查看时看起来完全正常)会在我的Android代码中使用时中断。带有重音符号,省略号字符,卷曲引号字符等的字符被其他字符替换 - 也许将其从UTF-8翻译为ASCII?我不确定。我正在使用GET请求从服务器提取JSON数据,解析它,将其存储在数据库中,然后使用Html.fromHtml()并将内容放在TextView中。

1 个答案:

答案 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();