OKHTTP- ISO -8859-1编码网页 - 已检索的页面源字符串中包含



经过数小时的反复试验,还有更多花费在我目前完全损失的解决方案的网络上爬行。

我成功地使用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);
            }
        });
    }
});

为了测试目的,我在文本视图中显示了下载的字符串,我注意到使用了德语特殊字母("ä","Ö"等)的"标志。我认为这是UTF-8< -> ISO-8859-1编码的问题,因为源没有使用"& auml;"或类似,但只是"ä",实际上目标网页指定以下内容:

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

i然后尝试将" addheader"属性包含在request.builder()中,但不会随输出而更改任何内容。我继续尝试使用Okhttp拦截器和字节来尝试奇怪的事情,但是对我没有任何帮助,因为在重新编码和介绍之前,我永远无法掌握响应。

我如何告诉OKHTTP尊重ISO-8859-1编码,并防止其更换所有特殊字符("ä","Ö",","ü"等)。

非常感谢大家圣诞快乐。

编辑/答案:

使用Google的Guava库,我能够检索正确编码的页面源:

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

okhttp不会解析您的HTML以读取其中的内容类型。取而代之的是,您需要将其指定为string()的参数。更好的是,让您的服务器在响应的内容类型标题中包含适当的charset。

相关内容

最新更新