页面通过代理加载,但带重音的字母返回时变成了乱码。在更换代理之前,先找出响应字节首次变成 Java String 的位置。没有显式 charset 的 InputStreamReader 可能在 jsoup 看到文档之前就做出该判断。

当 jsoup 自行处理抓取时,请让响应保持完整直到解析:

Connection.Response response = Jsoup
    .connect("https://www.example.com/catalog")
    .proxy("proxy.example", 8080)
    .execute();
Document page = response.parse();

响应 API 会暴露由 Content-Type 推导出的 charset 信息。当你确认服务器的声明有误时,它也可以接受显式的 charset 覆盖。仅凭代理地址无法得知文档使用哪种字符编码。如果你需要在不使用代理账户的情况下对公开页面做允许范围内的比较,请把示例中的 HTTP 主机和端口换成 HTTP 代理列表 中的候选,同时保持相同的编码检查。

如果由其他 HTTP 客户端提供 InputStream,jsoup 的流式解析重载接受 charset 名称和基础 URI。charset 为 null 时会启用其有文档记载的探测与回退行为;已知且正确的 HTTP charset 应当有意传递下去。基础 URI 为相对链接提供上下文。

一旦字节被错误解码,再用另一种 charset 解析得到的 String 并不能恢复原始文本。请回到字节和响应元数据。还要比较实际收到的内容:代理的登录页或拒绝响应可能与所请求页面是完全不同的文档,而不是其中的解码失败。

相关文章