2012-02-28 80 views
1

我試圖確保我的數據路徑 - 一個Tomcat servlet通過JDBC將數據導入/導出MySQL數據庫 - 直接處理Unicode。Java + unicode + HttpServletResponse =失敗

我已經能夠驗證我可以從數據庫讀取/寫入Unicode。 (當我在Eclipse中調試Tomcat時,我看到了從數據庫中正確檢索到的結果。)但是當我將瀏覽器指向Tomcat servlet時,類似「Garcí a」(= Garci {U + 0301} a)的字符串變成「Garci?a」在瀏覽器中。

我使用這段代碼初始化XML輸出(requestresponse是,它使用XMLStreamWriter,我宣佈結果爲UTF-8:

final protected HttpServletRequest request; 
final protected HttpServletResponse response; 
    ... 

boolean handleRefreshMetadata() 
{ 
    String s = request.getParameter("ids"); 
    Integer id = Integer.parseInt(s); 
    boolean b = refreshMetadata(id); 
    response.setContentType("text/xml"); 
    try { 
     PrintWriter writer = response.getWriter(); 
     XMLOutputFactory factory = XMLOutputFactory.newInstance(); 
     XMLStreamWriter xmlwriter = factory.createXMLStreamWriter(writer);  

     xmlwriter.writeStartDocument("UTF-8", "1.0"); 
     xmlwriter.writeStartElement("response"); 
     xmlwriter.writeAttribute("success", b ? "true" : "false"); 
     if (b && (id != null)) 
     { 
      loadArticleFromID(getConnection(), xmlwriter, id); 
     } 
     xmlwriter.writeEndDocument(); 
     xmlwriter.flush(); 
     xmlwriter.close(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (XMLStreamException e) { 
     e.printStackTrace(); 
    } 
    catch (SQLException e) { 
     e.printStackTrace(); 
    } 
    return b; 
} 

我缺少的東西

回答

4

Darnit,我想通了:

,而不是

response.setContentType("text/xml"); 

我需要做的:

response.setContentType("text/xml; charset=utf-8"); 
0

您的內容不是Unicode編碼。對響應內容進行編碼,如下所示:

final javax.servlet.http.HttpServletResponse resp = (HttpServletResponse)ctx.getExternalContext().getResponse(); 

byte[] k =xml.getBytes(UTF8_CHARSET); // xml is the string with unicode content 

resp.setContentType("text/xml"); 
resp.setContentLength(k.length); 
resp.getOutputStream().write(k); 
resp.getOutputStream().flush(); 
resp.getOutputStream().close();