Java URLConnection utf-8编码不';行不通

Java URLConnection utf-8编码不';行不通,java,encoding,utf-8,urlconnection,Java,Encoding,Utf 8,Urlconnection,我正在为网站编写一个只使用英语的小爬虫,并通过打开URL连接来实现这一点。我对请求和InputStreamReader都将编码设置为utf-8,但对于一些请求,我继续获得gobbledigook,而其他请求工作正常 下面的代码代表了我所做的所有研究和建议。我还尝试将URLConnection更改为HttpURLConnection,但没有运气。返回的某些字符串仍然如下所示: r?H?p?n?c?)?d?G?o?Xj{x??p$a?Qt?&?e?a?lfVx?='b?=Y(defuefee='a8

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

下面的代码代表了我所做的所有研究和建议。我还尝试将
URLConnection
更改为
HttpURLConnection
,但没有运气。返回的某些字符串仍然如下所示:

r?H?p?n?c?)?d?G?o?Xj{x??p$a?Qt?&?e?a?lfVx?='b?=Y(defuefee='a8?{o?zY?2m?3c@

我错过了什么

我的代码:

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;
}

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

conn.setRequestProperty("Accept-Encoding", "identity");
即使如此,HTTP客户机类也为您处理GZIP压缩,因此您不必担心类似的细节。这里出现的问题似乎是服务器有问题:它不会发送
内容编码
头来告诉您内容被压缩。这种行为似乎取决于
用户代理
,因此t该网站在常规web浏览器中工作,但在Java中使用时会中断。因此,设置用户代理也可以解决此问题:

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

你有一个失败的示例URL吗?你有没有看过网络上出现的内容(例如Wireshark)?这看起来一点都不像文本。它(可能)是PDF文件?还是压缩的?我怀疑这是一个“简单”的问题UTF-8的问题。这里有一个失败的URL。同样,它只是有时失败。在其他情况下,它可以正常工作。我认为您需要查看http响应头以了解内容类型和使用的字符集。我没有查看有关设置http请求属性的文档,但我认为这只是对另一方的提示。他们可能没有遵循您的提示。只是看了一下。我认为您应该调用getContentType、getContentEncoding()和getContentLength()来了解您正在处理的内容,以便正确处理它。