Java URLConnection utf-8编码不起作用

时间:2014-02-05 08:52:23

标签: java encoding utf-8 urlconnection

我正在为仅使用英语的网站编写一个小型抓取工具,并通过打开URL连接来执行此操作。我在请求和utf-8上都将编码设置为InputStreamReader,但我继续对某些请求进行gobbledigook,而其他请求正常。

以下代码代表我所做的所有研究和建议。我也尝试过将URLConnection更改为HttpURLConnection而没有运气。一些返回的字符串仍然如下所示:

...} R H ???? P N C 16] d克邻?? XJ {x“的P $一个Qt#&安培;??????????????E中的# ????? lfVx)?='b'“Y(defUeefee = ??????。?? A8 ?? {ö?????? ZY?2?m ??? 3C ?? @ < / p>

我错过了什么?

我的代码:

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 个答案:

答案 0 :(得分:3)

服务器正在发送压缩文档GZIP。您可以设置Accept-Encoding HTTP标头,使其以纯文本格式发送文档。

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

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

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