2012-02-28 7 views
1

JDBCを介してMySQLデータベースにデータを入出力するTomcatサーブレットのデータパスが、Unicodeを直接処理するようにしています。Java + unicode + HttpServletResponse = fail

データベースからUnicodeを読み書きできることを確認できました。 (EclipseでTomcatをデバッグすると、データベースから正しく検索された結果が表示されます)。しかし、Tomcatサーブレットでブラウザを指定すると、 "Garcí a"(= Garci {U + 0301} a)のような文字列がブラウザの「Garci?a」。

私はrequest(XML出力を初期化するために、このコードの断片を使用してresponseされ、て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();