0

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

4

1 回答 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 回答