Frage

Ich versuche java.util.Scanner zu verwenden Wikipedia Inhalte zu nehmen und es für Wort basierter Suche zu verwenden. Tatsache ist, dass es alles in Ordnung ist, aber wenn ein paar Worte zu lesen es mir Fehler geben. Mit Blick auf Code und machen einige überprüfen es stellte sich heraus, dass mit einigen Worten, es scheint nicht die Codierung zu erkennen, oder so, und der Inhalt ist nicht mehr lesbar. Dies ist der Code verwendet, um die Seite zu übernehmen:

// -Start -

try {
        connection =  new URL("http://it.wikipedia.org
wiki/"+word).openConnection();
                    Scanner scanner = new Scanner(connection.getInputStream());
        scanner.useDelimiter("\\Z");
        content = scanner.next();
//          if(word.equals("pubblico"))
//              System.out.println(content);
        System.out.println("Doing: "+ word);
//End

Das Problem entsteht, mit Worten wie „pubblico“ für die italienische wikipedia. das Ergebnis der println auf Wort pubblico ist wie folgt (abgeschnittene): ï¿ï¿½] Ksr> � ~ E �1A���E�ER3tHZ�4v�� & PZjtc�¿½ï¿½D�7_ | ���� = 8��Ø}

Haben Sie eine Idee, warum? Doch auf Seite Quelle geschaut und Header sind die gleiche, mit gleicher Codierung ...

sich gezeigt, dass Inhalte im gzip, so kann ich sagen, wikipedia nicht mir TEIR Seiten Reißverschluss zu senden oder es ist der einzige Weg? danke

War es hilfreich?

Lösung

Versuchen Sie, eine Reader anstelle eines InputStream mit - ich denke, es ist so etwas wie dies funktioniert:

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
String ctype = connection.getContentType();
int csi = ctype.indexOf("charset=");
Scanner scanner;
if (csi > 0)
    scanner = new Scanner(new InputStreamReader(connection.getInputStream(), ctype.substring(csi + 8)));
else
    scanner = new Scanner(new InputStreamReader(connection.getInputStream()));
scanner.useDelimiter("\\Z");
content = scanner.next();
if(word.equals("pubblico"))
    System.out.println(content);
System.out.println("Doing: "+ word);

Sie können auch nur den Zeichensatz an den Scanner Konstruktor übergeben direkt wie in einer anderen Antwort angegeben.

Andere Tipps

Versuchen Sie, den Scanner mit einem bestimmten Zeichensatz:

public Scanner(InputStream source, String charsetName)

Für den Standard-Konstruktor:

  

Bytes aus dem Stream wird in Zeichen umgewandelt unter Verwendung der Standard-charset zugrunde liegende Plattform.

Scanner auf java.sun.com

Sie benötigen einen URLConnection zu verwenden, so dass Sie die Content-Type-Header in der Antwort. Dies sollten Sie die Zeichenkodierung sagen zu verwenden, wenn Sie a href <= "http://java.sun.com/j2se/1.5.0/docs/api/java/util/Scanner.html#Scanner(java.io. INPUTSTREAM-% 20java.lang.String)“rel = "nofollow noreferrer"> erstellen Sie Ihre Scanner .

Im Einzelnen sehen Sie die "charset" Parameter der Content-Type-Header.


gzip-Komprimierung zu hemmen, die Accept-Encoding-Header auf "Identität". Siehe der HTTP-Spezifikation für weitere Informationen.

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
            connection.addRequestProperty("Accept-Encoding","");
            System.out.println(connection.getContentEncoding());
            Scanner scanner = new Scanner(new InputStreamReader(connection.getInputStream()));
            scanner.useDelimiter("\\Z");
            content = new String(scanner.next());

Codierung ändert sich nicht. warum?

connection =  new URL("http://it.wikipedia.org/wiki/"+word).openConnection();
//connection.addRequestProperty("Accept-Encoding","");
//System.out.println(connection.getContentEncoding());

InputStream resultingInputStream = null;       // Stream su cui fluisce la pagina scaricata
String encoding = connection.getContentEncoding();    // Codifica di invio (identity, gzip, inflate)
// Scelta dell'opportuno decompressore per leggere la sorgente
if (connection.getContentEncoding() != null && encoding.equals("gzip")) {
    resultingInputStream = new GZIPInputStream(connection.getInputStream());
}
else if (encoding != null && encoding.equals("deflate")) {
    resultingInputStream = new InflaterInputStream(connection.getInputStream(), new Inflater(true));
}
else {
    resultingInputStream = connection.getInputStream();
}

// Scanner per estrarre dallo stream la pagina per inserirla in una stringa
Scanner scanner = new Scanner(resultingInputStream);
scanner.useDelimiter("\\Z");
content = new String(scanner.next());

So funktioniert !!!

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top