我有一种感觉,我在这里做错了什么,但是我不确定是错过了一步,还是遇到编码问题或其他问题。这是我的代码:
URL url = new URL("http://api.stackoverflow.com/0.8/questions/2886661"); BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream())); // Question q = new Gson().fromJson(in, Question.class); String line; StringBuffer content = new StringBuffer(); while ((line = in.readLine()) != null) { content.append(line); }
当我打印内容时,我会得到一大堆的装饰物和特殊字符,基本上是乱码。我会在这里复制并粘贴它,但这不起作用。我究竟做错了什么?
在这种情况下,这不是字符编码问题,而是内容编码问题。您正在等待文本,但是服务器使用压缩来节省带宽。如果在获取该URL时查看标题,则可以看到您连接的服务器正在返回压缩的内容:
GET /0.8/questions/2886661 HTTP/1.1 Host: api.stackoverflow.com HTTP/1.1 200 OK Server: nginx Date: Sat, 22 May 2010 15:51:34 GMT Content-Type: application/json; charset=utf-8 <more headers> Content-Encoding: gzip <more headers>
因此,您要么需要像stevedbrown建议的那样使用像Apache的HttpClient这样的更智能的客户端(尽管您需要进行一些调整才能使它自动说出Gzip),或者显式解压缩示例代码中获得的流。对于声明输入的行,请尝试以下操作:
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(url.openStream())));
我已验证该方法适用于您尝试获取的网址。