2012-04-14 23 views
0

我使用這個servlet來提取另一個域的HTML內容在我自己的Ajax頁面,包括,它指定響應爲「UTF-8」:如何處理的字符集的差異在Java中

public class ProxyServlet extends HttpServlet { 
    public void doGet(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException { 
     String urlString = request.getParameter("url"); 
     try { 
      URL url = new URL(urlString); 
      url.openConnection();    
      BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
      response.setContentType("text/html; charset=UTF-8"); 
      PrintWriter out = new PrintWriter(new OutputStreamWriter(response.getOutputStream(), "UTF8"), true); 
      char[] buf = new char[4 * 1024]; 
      int len; 
      while ((len = reader.read(buf, 0, buf.length)) != -1) { 
       out.write(buf, 0, len); 
      } 
      out.flush(); 
     } 
     catch (MalformedURLException e) {  
      throw new ServletException(e); 
     } 
     catch (IOException e) {  
      throw new ServletException(e); 
     } 
    } 
} 

我解壓的文件有一個meta標籤是這樣的:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta> 

我複製並粘貼它放到自己的網頁,因此完全匹配。根據瀏覽器頁面信息,它是肯定使用「UTF-8」編碼。然而,我仍然在提取的html內容中使用「Â」而不是「& nbsp」。

它們實際上包含在這個ProxyServlet的responseText中。我想明確地定義響應內容類型和輸出流charset會處理這個,但我必須錯過什麼?有沒有人解決過這個問題。

回答

1

而不是將字節流轉換爲字符,反之亦然,您可以通過字節[]緩衝區從ONY字節流複製到另一個字節流。或者使用Spring的UTIL:

FileCopyUtils.copy(uri.getInputStream(), response.getOutputStream()); 

或明確:

byte[] buffer = new byte[BUFFER_SIZE]; 
int bytesRead = -1; 
while ((bytesRead = in.read(buffer)) != -1) { 
    out.write(buffer, 0, bytesRead); 
} 
out.flush(); 

這將保證數據是按原樣複製的(沒有可能通過錯誤的字符擰東西)

+0

剛試過,沒有運氣。 – Geronimo 2012-04-14 18:12:07

+0

查看我的更新回答。 – 2012-04-14 18:12:24

+0

是的,它解決了它。謝謝。 – Geronimo 2012-04-14 18:56:12