Java + Unicode + HttpServletResponse = сбой - PullRequest
1 голос
/ 29 февраля 2012

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

Я смог убедиться, что могучтение / запись Unicode из базы данных.(Когда я отлаживаю Tomcat в Eclipse, я вижу результат, полученный из базы данных правильно.) Но когда я указываю своему браузеру на мой сервлет Tomcat, строка типа «García» (= Garci {U + 0301} a) превращается в «Garci».? 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;
}

Я что-то упустил?

Ответы [ 2 ]

4 голосов
/ 29 февраля 2012

Дарнит, я разобрался:

вместо

response.setContentType("text/xml");

Мне нужно сделать:

response.setContentType("text/xml; charset=utf-8");
0 голосов
/ 04 марта 2015

Ваш контент не закодирован в 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();
...