OkHttp - ISO-8859-1编码的网页 - 包含在检索到的页面源字符串中

时间:2016-12-24 21:55:36

标签: android encoding okhttp iso-8859-1 okhttp3

经过数小时的试验和错误以及更多花在抓取网络上寻求解决方案之后,我目前完全失败了。

我成功使用OkHttp以下列方式检索网页来源:

Request request = new Request.Builder()
        .url(APIURL + Integer.toString(StopIndex) + "/")
        .addHeader("Content-Type", "text/html; charset=ISO-8859-1")
        .build();
client.newCall(request).enqueue(new Callback() {
    @Override
    public void onFailure(Call call, IOException e) {
        Log.e("OkHttp request issue", e.toString());
    }

    @Override
    public void onResponse(Call call, Response response) throws IOException {
        PageSource = response.body().string();
        StopActivity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                tv1.setText(PageSource);
            }
        });
    }
});

出于测试目的,我在TextView中显示下载的字符串,并且在使用德语特殊字母(“ä”,“ö”等)的地方注意到“ ”符号。我认为这是UTF-8< - >的问题。 ISO-8859-1编码,因为源没有使用“& auml”;或类似的,但只是“ä”,实际上目标网页指定以下内容:

<meta content="text/html; charset=ISO-8859-1" http-equiv="Content-Type" />

然后我尝试在Request.Builder()中包含“addHeader”属性,但它不会随输出改变任何内容。我继续尝试使用OkHttp拦截器和ByteBuffers进行奇怪的事情,但是对我来说没有任何效果,因为在重新编码和引入之前我无法得到响应。

如何告诉OkHttp尊重ISO-8859-1编码并防止它用 替换所有特殊字符(“ä”,“ö”,“ü”等)?

非常感谢大家和圣诞快乐。

编辑/答案:

使用Google提供的Guava库,我可以按如下方式检索正确编码的页面源:

String pageSource = CharStreams.toString(new InputStreamReader(response.body().byteStream(), "ISO-8859-1"));

1 个答案:

答案 0 :(得分:1)

OkHttp不会解析您的HTML以读取其中的内容类型。相反,您需要将自己的charset指定为string()的参数。更好的是,让服务器在响应的内容类型标题中包含正确的字符集。