2011-05-07 63 views
2

某些页面的内容中包含HTML特殊字符,但它们显示为方块(未知字符)。下载页面中的HTML字符不能正确显示

我该怎么办?

我可以将包含carachters的字符串转换为另一种格式(UTF-8)吗?它发生在从InputStream到String的转换中。我真的不知道是什么原因造成的。

public HttpURLConnection openConnection(String url) { 
    try { 
     URL urlDownload = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) urlDownload.openConnection(); 
     con.setInstanceFollowRedirects(true); 
     con.connect(); 
     return con; 
    } catch (Exception e) { 
     return null; 
    } 
} 

private String getContent(HttpURLConnection con) { 
    try { 
     return IOUtils.toString(con.getInputStream()); 
    } catch (Exception e) { 
     System.out.println("Erro baixando página: " + e); 
     return null; 
    } 
} 

page.setContent(getContent(openConnection(con))); 
+0

你能否包含你当前的代码? – eggyal 2011-05-07 13:24:45

回答

4

您需要在下载的HTML页面的Content-Type头与指定的字符集读取InputStream使用InputStreamReader。否则,将使用平台默认字符集,这显然与您的情况下的HTML不一样。

Reader reader = new InputStreamReader(input, "UTF-8"); 
// ... 

你当然也可以使用像Jsoup一个HTML阅读器/分析器会自动考虑到这一点。

String html = Jsoup.connect("http://stackoverflow.com").get().html(); 

更新:根据您的更新问题,你似乎可以用URLConnection请求HTML页面和IOUtilsInputStream转换为String。您需要使用它,如下所示:

String contentType = connection.getHeaderField("Content-Type"); 
String charset = "UTF-8"; // Default to UTF-8 
for (String param : contentType.replace(" ", "").split(";")) { 
    if (param.startsWith("charset=")) { 
     charset = param.split("=", 2)[1]; 
     break; 
    } 
} 

String html = IOUtils.toString(input, charset); 

如果你仍然有越来越字符正确的问题,那么它只能意味着控制台/观众,你要打印的字符没有按不支持字符集。例如,在Eclipse中运行以下代码时

System.out.println(html); 

然后,您需要确保Eclipse控制台使用UTF-8。您可以通过设置窗口>首选项>常规>工作区>文本文件编码

或者,如果你被FileWriter其写入一些文件,那么你应该宁可使用从一开始就InputStream/OutputStream而不首先将其转换为String。如果转换为String确实是一个重要步骤,那么您需要将其写入new OutputStreamWriter(output, "UTF-8")

+0

与Jsoup仍然是一回事,但我会尝试使用InputStreamReader。 – 2011-05-07 13:44:48

+1

然后它是不支持字符集的查看器/控制台。你在哪里打印/查看HTML内容?在Eclipse控制台例如?您需要将其配置为支持UTF-8。还是你在写文件?然后你需要在'Writer'中使用相同的字符集。有关更多背景信息,请查看http://balusc.blogspot.com/2009/05/unicode-how-to-get-characters-right.html – BalusC 2011-05-07 13:47:02

+0

好的,我知道我现在必须做什么,但在某些页面中,编码不在charset属性中,但在编码或其他方面(HTML,XHTML等之间的差异)有一些类自动获取它?我使用HTMLParser来解析HTML。我在有问题的页面中使用了ISO-8859-1,并解决了问题。现在我只需要在页面中获得编码。 – 2011-05-07 14:14:49