4

ここで何か間違ったことをしているような気がしますが、ステップが抜けているのか、それともエンコーディングの問題か何かがあるだけなのかはよくわかりません。これが私のコードです:

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

コンテンツを印刷すると、たくさんのウイングや特殊文字が表示されます。ここにコピーして貼り付けますが、うまくいきません。私は何を間違っていますか?

4

3 に答える 3

5

この場合、これは文字エンコーディングの問題ではなく、コンテンツのエンコーディングの問題です。テキストを期待していますが、サーバーは帯域幅を節約するために圧縮を使用しています。その URL を取得するときにヘッダーを見ると、接続先のサーバーが gzip されたコンテンツを返していることがわかります。

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())));

取得しようとしている URL でこれが機能することを確認しました。

于 2010-05-22T15:54:08.397 に答える
1

代わりにApache Http Clientを使用してください。文字変換が適切に処理されます。そのサイトの例から:

public final static void main(String[] args) throws Exception {

    HttpClient httpclient = new DefaultHttpClient();

    HttpGet httpget = 
        new HttpGet("http://api.stackoverflow.com/0.8/questions/2886661"); 

    System.out.println("executing request " + httpget.getURI());

    // Create a response handler
    ResponseHandler<String> responseHandler = new BasicResponseHandler();
    String responseBody = httpclient.execute(httpget, responseHandler);
    System.out.println(responseBody);

    System.out.println("----------------------------------------");

    // When HttpClient instance is no longer needed, 
    // shut down the connection manager to ensure
    // immediate deallocation of all system resources
    httpclient.getConnectionManager().shutdown();        
}

この場合、http://svn.apache.org/repos/asf/httpcomponents/httpclient/branches/4.0.x/httpclient/src/examples/org/apache/http/examples/client/ClientGZipContentCompression.javaを参照してください。 Gzip コンテンツの処理方法を示します。

于 2010-05-22T15:39:06.867 に答える
1

場合によっては、API 呼び出しの応答が圧縮されます。スタック交換 API。ドキュメントを参照して、使用している圧縮を確認してください。GZIP または DEFLATE 圧縮を使用するものもあります。GZIP 圧縮の場合は、次を使用します。

InputStream is = new URL(url).openStream();
BufferedReader in = new BufferedReader(new InputStreamReader(new GZIPInputStream(is)));
于 2014-09-23T11:09:33.520 に答える