0

我正在尝试使用 java.util.Scanner 获取维基百科内容并将其用于基于单词的搜索。事实是这一切都很好,但是在阅读一些单词时它会给我带来错误。查看代码并进行一些检查,结果发现有些单词似乎无法识别编码,或者内容不再可读。这是用于获取页面的代码:

// -开始-

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

意大利维基百科的“pubblico”一词出现了问题。pubblico 上的 println 的结果是这样的(剪切):ï¿ï¿½]Ksr>�~E �1A���E�ER3tHZ�4v��&PZjtc�¿½ï¿ ½D�7_|����=8��Ø}

你知道为什么吗?然而查看页面源和标题是相同的,具有相同的编码......

结果发现内容是压缩的,所以我可以告诉维基百科不要给我发送压缩的页面还是唯一的方法?谢谢你

4

5 回答 5

2

尝试使用具有指定字符集的扫描仪:

public Scanner(InputStream source, String charsetName)

对于默认构造函数:

使用底层平台的默认字符集将流中的字节转换为字符。

java.sun.com 上的扫描仪

于 2009-02-11T21:58:08.960 回答
1

尝试使用 aReader而不是InputStream- 我认为它的工作原理是这样的:

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

您也可以直接将字符集传递给 Scanner 构造函数,如另一个答案中所示。

于 2009-02-11T22:02:35.657 回答
1

您需要使用URLConnection, 以便您可以确定响应中的内容类型标头。这应该告诉您在创建Scanner.

具体来说,查看内容类型标头的“charset”参数。


要禁止 gzip 压缩,请将 accept-encoding 标头设置为“identity”。有关详细信息,请参阅HTTP 规范

于 2009-02-11T22:03:41.397 回答
0
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());

编码不变。为什么?

于 2009-02-12T16:14:44.003 回答
0
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());

所以有效!

于 2009-02-12T22:37:04.537 回答