【问题标题】:Java + unicode + HttpServletResponse = failJava + unicode + HttpServletResponse = 失败
【发布时间】:2012-03-18 10:57:58
【问题描述】:

我正在尝试确保我的数据路径——一个通过 JDBC 将数据传入/传出 MySQL 数据库的 Tomcat servlet——直接处理 Unicode。

我已经能够验证我可以从数据库中读取/写入 Unicode。 (当我在 Eclipse 中调试 Tomcat 时,我看到从数据库中正确检索到的结果。)但是当我将浏览器指向我的 Tomcat servlet 时,像 "García" (=Garci{U+0301}a) 这样的字符串变成了 "Garci ?a”在浏览器中。

我正在使用此代码片段来初始化 XML 输出(requestresponse are ,它们使用 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;
}

我错过了什么吗?

【问题讨论】:

    标签: java xml unicode stax


    【解决方案1】:

    达尼特,我想通了:

    而不是

    response.setContentType("text/xml");
    

    我需要做的:

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

    【讨论】:

      【解决方案2】:

      您的内容不是 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();
      

      【讨论】:

        猜你喜欢
        • 2018-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-28
        • 2018-06-03
        • 1970-01-01
        • 2023-03-26
        • 2012-12-01
        相关资源
        最近更新 更多