经过数小时的反复试验,还有更多花费在我目前完全损失的解决方案的网络上爬行。
我成功地使用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。