2012-02-28 3 views
1

Я пытаюсь убедиться, что мой путь данных - сервлет Tomcat, получающий данные в/из базы данных MySQL через JDBC - обрабатывает Unicode напрямую.Java + unicode + HttpServletResponse = fail

Я смог проверить, что я могу читать/писать Юникод из базы данных. (Когда я отлаживаю Tomcat в Eclipse, я вижу результат, полученный из базы данных правильно.) Но когда я указываю свой браузер на моем сервлете Tomcat, строка, подобная «Garc & iacute; a» (= Garci {U + 0301} a), превращается в «Гарси?» В браузере.

Я использую этот фрагмент кода для инициализации вывода XML (request и 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

Вашего содержания не Юникод. Кодировать содержимое ответа примерно так:

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(); 
Смежные вопросы