2014-02-05 73 views
1

我正在爲英文網站編寫一個小型爬網程序,並通過打開URL連接來完成此操作。我在請求和InputStreamReader上都設置了utf-8的編碼,但我仍然對某些請求感到厭煩,而其他人則正常工作。Java URLConnection utf-8編碼不起作用

以下代碼代表我所做的所有研究和建議。我也試過改變URLConnectionHttpURLConnection沒有運氣。一些返回的字符串繼續如下所示:

??}?r?H?P?n?c ??]?d?G?o ?? Xj {?x?「P $ a?Qt?#& ?? e?a#????? lfVx)?='b?「Y(defUeefee = ??????。a8 ?? {O ?????? zY? ?2M的??? ?? 3C @

我缺少什麼

我的代碼:?

public static String getDocumentFromUrl(String urlString) throws Exception { 
    String wholeDocument = null; 

     URL url = new URL(urlString); 
     URLConnection conn = url.openConnection(); 
     conn.setRequestProperty("Content-Type", "text/plain; charset=utf-8"); 
     conn.setRequestProperty("Accept-Charset", "utf-8"); 
     conn.setConnectTimeout(60*1000); // wait only 60 seconds for a response 
     conn.setReadTimeout(60*1000); 
     InputStreamReader isr = new InputStreamReader(conn.getInputStream(), "utf-8"); 
     BufferedReader in = new BufferedReader(isr); 

     String inputLine; 
     while ((inputLine = in.readLine()) != null) { 
      wholeDocument += inputLine;  
     }  
     isr.close(); 
     in.close();   

    return wholeDocument; 
} 
+0

您是否有示例URL失敗?你看過網絡上會發生什麼(例如使用Wireshark)嗎? –

+0

這看起來不像文本。它(可能)是PDF文件嗎?還是壓縮?我懷疑這是UTF-8的一個「簡單」問題。 –

+0

這是一個失敗的URL。再次,它只是有時失敗。在其他人工作正常。 http://www.broadbandtvnews.com/2014/02/04/samsung-adds-the-weather-channel/ – Eddy

回答

3

服務器發送文件gzip壓縮可以設置Accept-Encoding HTTP標頭使其以純文本格式發送文檔。

conn.setRequestProperty("Accept-Encoding", "identity"); 

即便如此,HTTP客戶端類爲您處理GZIP壓縮,所以你不應該擔心這樣的細節。這裏似乎正在發生的事情是服務器有問題:它不會發送Content-Encoding標題來告訴你內容已被壓縮。這種行爲似乎取決於User-Agent,因此該網站在常規Web瀏覽器中工作,但在使用Java時會中斷。因此,設置用​​戶代理也解決了問題:

conn.setRequestProperty("User-Agent", "Mozilla/5.0"); // for example