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()来了解您正在处理的内容,以便正确处理它。