有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java URLConnection utf8编码不起作用

我正在为网站编写一个只使用英语的小爬虫,并通过打开URL连接来实现这一点。我在请求和InputStreamReader上都将编码设置为utf-8,但对于一些请求,我继续使用gobbledigook,而其他请求则可以正常工作

下面的代码代表了我所做的所有研究和建议。我也尝试过把URLConnection改成HttpURLConnection,但运气不好。返回的某些字符串仍然如下所示:

什么?RHPNc??]?DGo??Xj{x?“P$a?Qt?&;e?a?lfVx)?='b?”Y(defUeefee=@

我错过了什么

我的代码:

public static String getDocumentFromUrl(String urlString) throws Exception {
    String wholeDocument = null;

        URL url = new URL(urlString);
        URLConnection conn = url.openConnection();
        conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8");
        conn.setRequestProperty("Accept-Charset", "utf-8");
        conn.setConnectTimeout(60*1000); // wait only 60 seconds for a response
        conn.setReadTimeout(60*1000);
        InputStreamReader isr = new InputStreamReader(conn.getInputStream(), "utf-8");
        BufferedReader in = new BufferedReader(isr);

        String inputLine;
        while ((inputLine = in.readLine()) != null) {
            wholeDocument += inputLine;     
        }       
        isr.close();
        in.close();         

    return wholeDocument;
}

共 (1) 个答案

  1. # 1 楼答案

    服务器正在发送压缩的文档GZIP。您可以设置Accept-EncodingHTTP头,使其以纯文本形式发送文档

    conn.setRequestProperty("Accept-Encoding", "identity");
    

    即使如此,HTTP客户机类也为您处理GZIP压缩,因此您不必担心这样的细节。这里的情况似乎是服务器有问题:它不会发送Content-Encoding头来告诉您内容被压缩了。这种行为似乎取决于User-Agent,因此该站点可以在常规web浏览器中工作,但从Java使用时会中断。因此,设置用户代理也解决了这个问题:

    conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // for example