2011-05-07 93 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