Question

Je suis en train d'utiliser java.util.Scanner de prendre le contenu de Wikipédia et de l'utiliser pour les recherches sur la base de mots. Le fait est que tout cela est bien, mais en lisant quelques mots il me donner des erreurs. En regardant le code et de faire vérifier certains il est apparu que quelques mots il semble de ne pas reconnaître l'encodage, ou si, et le contenu est plus lisible. Ceci est le code utilisé pour prendre la page:

// -Commencez -

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

Le problème se pose avec des mots comme « pubblico » pour le wikipedia italien. le résultat de la println sur le mot pubblico est comme ça (cutted): ï¿ï¿½] Ksr> ~ E ï ¿½ �1A���E�ER3tHZ�4v�� & PZjtc�¿½ï¿½D�7_ | ���� = 8��Ø}

Avez-vous une idée pourquoi? Pourtant, regardé à la source de la page et les en-têtes sont les mêmes, avec le même encodage ...

se sont avérés que le contenu est gzip, donc je peux dire wikipedia ne pas me envoyer Teir pages avec zip ou il est le seul moyen? merci

Était-ce utile?

La solution

Essayez d'utiliser un Reader au lieu d'un InputStream - Je pense que cela fonctionne comme ceci:

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

Vous pouvez également passer juste le charset au constructeur du scanner directement comme indiqué dans une autre réponse.

Autres conseils

Essayez d'utiliser le scanner avec un jeu de caractères spécifié:

public Scanner(InputStream source, String charsetName)

Pour le constructeur par défaut:

  

octets du flux sont convertis en caractères en utilisant le jeu de caractères par défaut de la plate-forme sous-jacente.

Scanner sur java.sun.com

Vous devez utiliser un URLConnection, de sorte que vous vous pouvez déterminer le en-tête de type de contenu dans la réponse. Cela devrait vous dire le codage de caractères à utiliser lorsque vous créer votre Scanner.

Plus précisément, regardez le paramètre "charset" de l'en-tête de type de contenu.


Pour inhiber la compression gzip, définir l'en-tête Accept-Encoding à l ' "identité". Voir la spécification HTTP pour plus d'informations.

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

encodage ne change pas. pourquoi?

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

fonctionne donc !!!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top