2016-05-15 9 views
2

Ich verwende den RSS-Feed von kat.cr für ein persönliches Projekt. Ich habe versucht, den Feed mit dem Rom-Framework zu lesen, und habe ein erhebliches Problem festgestellt.Spezifische XML-Daten verstümmelt

Alle anderen Feeds, die ich versuchte, Rom zu verwenden (und andere, grundlegendere Möglichkeiten, den Feed zu lesen), funktionierten einwandfrei, aber der folgende Feed warf weiterhin Zeichencodierungs-bezogene Ausnahmen auf.

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

Ich habe dann die folgende Methode, um zu sehen, welche Daten empfangen sah aus wie:

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

Die oben genannten Feed Ergebnisse in verstümmelte Daten während alle anderen Feeds perfekt erscheinen. Warum zeigt es sich perfekt in jedem Browser, selbst wenn der Zeichensatz auf UTF-8 gezwungen wird?

Ich habe die 'XML.txt' Datei in Hexplorer betrachtet und festgestellt, UTF-8 Codierung Byte-Sequenzen in der gesamten Datei.

Ich bin gründlich verloren, jede Hilfe wäre sehr geschätzt.

Antwort

0

Der Inhalt, den Sie erhalten, wird im GZip-Format komprimiert.

Jetzt würde ich eine bessere Antwort schreiben mit einer Möglichkeit, Ihr Problem zu lösen, aber Ihre Methode führt zu String und an diesem Punkt haben Sie wahrscheinlich bereits die Rohbytes vom Server geändert, so dass eine Konvertierung nicht funktioniert. Ich weiß nichts über das Rom-Framework oder wie man es Bytes zurückgibt oder dekomprimiert für Sie. Aber vorausgesetzt, Sie haben einige komprimierte gzip Bytes, die Sie tun können:

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

Sie könnten versuchen, diese mit

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

Allerdings würde ich überrascht, wenn es funktionierte. Vielleicht können Sie tun

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

Aber wieder habe ich keine Ahnung, wie das Rom-Framework Dinge tut.


Edit:

Sie auch für die GZIP Dateisignatur aussehen könnte. Ich schaue die Datei-Signatur von dieser Website - http://www.garykessler.net/library/file_sigs.html, aber Sie können es an vielen Orten nachschlagen. Angenommen, Sie haben die Bytes von der Antwort, die Sie so etwas wie tun könnte:

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

Jetzt habe ich für den Versuch befürworten würde die Rom-Bibliothek machen Sie kümmern sich um das, aber wenn alles andere wäre dies nicht eine Art und Weise zu tun, es.

+0

Das war genau das. Vielen Dank für Ihre Hilfe. Wenn es dir nichts ausmacht, frage ich, wie genau hast du festgestellt, dass es mit gzip komprimiert wurde? Haben Sie es anhand der Bytefolge identifiziert, die Sie in Ihrer Antwort angegeben haben? –

+0

@fakeskuH Nun, ich ging zu der URL in meinem Browser und es hat gut funktioniert, so dass ich denke, dass es etwas in Ihrem Code (oder die Rom-Bibliothek), die es nicht richtig behandelt. Beim Betrachten der HTTP-Header von dieser Website sah ich, dass es den Header '" content-encoding: gzip "' hatte. Ich habe einfach einen 'GZIPInputStream' um eine Testanfrage/Antwort geworfen und es hat funktioniert! –

+0

Ich wusste, dass ich etwas verpasst habe. Danke noch einmal! –