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.
中包含正确的字符集
经过数小时的反复试验,并花费更多时间在网络上搜寻解决方案,我目前完全不知所措。
我成功地使用 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.