Java URLConnection utf-8 编码不起作用

标签 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(defUeefee=??????.??a8??{O??????zY?2?M???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 header ,使其以纯文本格式发送文档。

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

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

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

关于Java URLConnection utf-8 编码不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21572485/

相关文章:

postgresql - 在 PostgreSQL 中转换重音字符?

Python Scrapy不返回中文字符

C# UTF8 读取/输出

ios - Swift URL.path 更改 utf-8 字符的编码

json - AVRO 验证

java.lang.LinkageError : loader constraint violation in interface itable initialization 错误

java - 到处使用 `final` 修饰符的开源 Java 项目

Java - 从 "http://www.example.com/something.php?id=1111"获取文件名

c - 为什么 Mac OS 上的 C 运行时允许预组合和分解的 UTF-8?

java - 使用 -Dmaven.surefire.debug 和 -DforkMode=never 运行 Maven 测试