2016-05-15 4 views
2

個人的なプロジェクトにkat.crのRSSフィードを使用しています。私はローマのフレームワークを使ってフィードを読み込もうとしましたが、重大な問題に遭遇しました。特定のXMLデータが文字化けする

他のすべてのフィード私はローマを使用しようとしました(そして、より基本的な、フィードを読む方法は)しかし、次のフィードは、文字エンコーディングに関連する例外をスローし続けました。

https://kat.cr/usearch/Arrow%20S04E21/?field=seeders&sorder=desc&rss=1

私は、データを受け取ったかを確認するには、次のメソッドを作成したように見えた:他のすべてのフィードが完全に表示しながら、データ化けで

public static void saveXML(String url) throws IOException { 
    Client client = ClientBuilder.newClient(); 
    Response r = client.target(url).request(MediaType.TEXT_PLAIN_TYPE).get(); 

    PrintWriter out = new PrintWriter("XML.txt"); 
    String sXML = r.readEntity(String.class); 
    out.print(sXML); 
    out.close(); 
} 

上記のフィード結果。 charsetが強制的にUTF-8になっても、すべてのブラウザで完全に表示されるのはなぜですか?

私はHexplorerの 'XML.txt'ファイルを見て、ファイル全体でUTF-8エンコードバイトシーケンスを確認しました。

私は完全に失われています、どんな助けも大いに感謝するでしょう。

答えて

0

受信したコンテンツは、GZip形式で圧縮されています。

私はあなたの問題を解決する方法でより良い答えを書こうとしていましたが、あなたのメソッドはStringになりました。その時点で、サーバから生のバイトがすでに変更されている可能性があります。私はローマのフレームワークの何も知らないか、バイトを返すか、これを解凍する方法を知っています。しかし、あなたはあなたが行うことができますいくつかのgzip圧縮バイトを持っていると仮定すると:それは働いていた場合、私は驚くだろうしかし

public static String decompress(byte [] data) throws IOException { 
    try (
     GZIPInputStream gis = new GZIPInputStream(new ByteArrayInputStream(data)); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ) { 

     int read; 
     byte [] buff = new byte[1024]; 
     while((read = gis.read(buff)) != -1) { 
      out.write(buff, 0, read); 
     } 

     return out.toString("UTF-8"); 
    } 
} 

あなたは

String sXML = r.readEntity(String.class); 
return decompress(sXML.getBytes()); 

でこれを試みることができます。多分あなたができるでしょう

String sXML = r.readEntity(byte[].class); 
return decompress(sXML.getBytes()); 

しかし、私はローマのフレームワークが何をするのか全く分かりません。


編集:

また、GZIPファイルの署名を見ることができます。私はこのウェブサイトのファイル署名を見ます - http://www.garykessler.net/library/file_sigs.htmlしかしあなたは多くの場所でそれを見ることができます。あなたが何か行うことができます応答からバイトをしていると仮定すると:私はこれの世話をしない、ローマのライブラリをしようとするために提唱う今

String sXML = r.readEntity(byte[].class); 
// check for gzip encoding using signature 
if(sXML.length > 3 && 
    sXML[0] == (byte)0x1F && 
    sXML[1] == (byte)0x8B && 
    sXML[2] == (byte)0x08) { 
    // Is gzip encoded, decode it. 
    return new String(decompress(sXML), "UTF-8"); 
} else { 
    return new String(sXML, "UTF-8"); 
} 

は、それ以外のすべてが失敗した場合にこれを行うための一つの方法だろうそれ。

+0

それはまさにそれでした。ご助力ありがとうございます。あなたが私に尋ねても構わないのであれば、それはgzipで圧縮されているとはどういうことでしたか?あなたはあなたの答えであなたが提供したバイトシーケンスを使ってそれを特定しましたか? –

+0

@fakeskuHまあ、私はブラウザのURLに行きました。うまくいきましたので、あなたのコード(またはローマの図書館)の中の何かが正しく処理されていないと思うようになりました。そのウェブサイトのHTTPヘッダーを見ると、ヘッダーに「content-encoding:gzip」というヘッダーがあることがわかりました。私はテストリクエスト/レスポンスの周りに 'GZIPInputStream'を投げただけで、うまくいきました! –

+0

私は何かを逃したことを知っていた。再度、感謝します! –

関連する問題