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

OkHttp - ISO-8859-1 encoded webpage - � included in retrieved page source string

经过数小时的反复试验,并花费更多时间在网络上搜寻解决方案,我目前完全不知所措。

我成功地使用 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" />

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

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

提前致谢,祝大家圣诞快乐。

编辑/答案:

使用 Google 中的 Guava 库,我能够按如下方式检索正确编码的页面源代码:

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

OkHttp 不会解析您的 HTML 来读取其中的 content-type。相反,您需要自己将字符集指定为 string() 的参数。更好的是,让您的服务器在响应的内容类型 header.

中包含正确的字符集