2014-02-05 6 views
1

영어로 된 사이트의 경우 작은 크롤러를 작성하고 URL 연결을 열어 해당 작업을 수행합니다. 요청시 utf-8으로 인코딩을 설정하고 InputStreamReader을 요청했지만 일부 요청에 대해서는 gobbledigook을 계속 받고 다른 일부는 정상적으로 작동합니다.Java URLConnection utf-8 인코딩이 작동하지 않습니다.

다음 코드는 내가 수행 한 모든 연구와 조언을 나타냅니다. 나는 또한 URLConnectionHttpURLConnection으로 바꾸려고 노력했다. 반환 된 문자열 중 일부는 다음과 같이 계속 표시됩니다.

??} r? H? P? n? c ?? d? G? o? X? {? x? "P $ (예 : defUeefee = "a", "a", "a", "b" ? 2 M ??? 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에 의존하는 것으로 보입니다. 따라서 사이트는 일반 웹 브라우저에서 작동하지만 Java에서 사용될 때는 중단됩니다. 따라서 사용자 에이전트를 설정하면 문제가 해결됩니다.

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