2011-03-04 19 views
1

我正在嘗試從URL中讀取數據,然後輸出結果。嘗試從URL讀取(使用Java)會在某些事件中產生亂碼

BufferedReader in = new BufferedReader(
    new InputStreamReader(new URL("http://somesite.com/").openStream(), "UTF-8")); 
String s = ""; 
while ((s=in.readLine())!=null) System.out.println(s); 
in.close(); 

它在大多數時間都很有效,並打印網站的來源。 但是,我的問題是,在特定的網站上,而不是源代碼,它會打印出亂碼,如符號和其他不尋常的字符。

是否有一些屬性會因網站而異,從而影響閱讀方式?該頁面在Firefox中加載得很好,我可以在那裏查看源代碼,沒有任何問題。如果firefox可以訪問源代碼,我應該可以;我只是不知道它爲什麼不工作...

編輯:添加「UTF-8」到InputStreamReader。所有奇怪的字符現在都是問號...仍然不能正常工作...

+4

有一個*亂碼*標籤?! – razlebe 2011-03-04 00:39:36

+1

你能舉出一個這樣的URL的例子嗎? – razlebe 2011-03-04 00:41:59

回答

1

您可能會遇到字符編碼問題。

應該有一個HTTP頭好像在迴應如下:

Content-Type: text/html; charset=UTF-8 
+0

我發現這個,並將我的InputStreamReader改爲'new InputStreamReader(new URL(「www.website.com」)。openStream(),「UTF-8」)'它將所有奇怪的字符改爲問號,真的沒有什麼幫助...... – 2011-03-04 00:48:39

+0

這並不意味着你正在使用的程序可以渲染字符,或者使用的字體知道這些字符是什麼。我們需要更多的信息。你在閱讀一個明顯使用非ASCII文本的網站嗎?客戶端能否呈現非ASCII文本? – Jeremy 2011-03-04 01:09:17

1

嘗試使用telnet診斷什麼過來了電線。它可能不是文本數據。例如,當你這樣做時會發生什麼?

telnet somesite.com 80 
GET/HTTP/1.0 
Host: somesite.com 

(最後行之後需要兩個回車)

這應該讓你看到標題和內容進來,應該給你一個更好的線索,這是怎麼回事。

1

我有同樣的問題,直到我用setChunkedStreamingMode設置HttpURLConnection。

  HttpURLConnection connection = (HttpURLConnection)serverAddress.openConnection(); 
      connection.setRequestMethod("GET"); 
      connection.setDoOutput(true); 
      connection.setReadTimeout(2000); 
      connection.setChunkedStreamingMode(0); 

      connection.connect(); 

      BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); 

      String line = ""; 

      while ((line = rd.readLine()) != null) 
      { 
       sb.append(line); 
      } 

      System.out.println(sb.toString()); 
1

因此,經過多次搜索,我找到了答案。 xml被讀爲亂碼,因爲它是Gzip壓縮的。讀取這個的方法是使用GZIPInputStream。這是因爲XML壓縮方式不同。

HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
    connection.setRequestProperty("Accept-Encoding", "gzip"); 
    InputStreamReader in = new InputStreamReader (new GZIPInputStream(connection.getInputStream())); 
    String str;    
    while (true) { 
int ch = in.read(); 
if (ch==-1) { 
    break; 
} 
相關問題