0

我创建了一个AbstractView以便将一些 XML 输出到浏览器,如下所示:

public abstract class AbstractXmlView extends AbstractView {

public AbstractXmlView() {
    setContentType("application/xml");
}

@Override
protected void renderMergedOutputModel(Map<String, Object> model,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    response.setCharacterEncoding("UTF-8");

    Document document = new DOMDocument();
    document.setXMLEncoding("UTF-8");

    buildXmlDocument(model, document, request, response);

    response.getOutputStream().print(document.asXML());
}

public abstract void buildXmlDocument(Map<String, Object> model,
        Document document, HttpServletRequest request,
        HttpServletResponse response) throws Exception;

如您所见,我的子类将定义该buildXMLDocument方法以填充将实际传递给浏览器的 XML 文档,因此这是一个简化的实现:

public class GetXmlContacts extends AbstractXmlView {

@Override
public void buildXmlDocument(Map<String, Object> model, Document document,
        HttpServletRequest request, HttpServletResponse response)
        throws Exception {

    Element node = document.addElement("node");
    node.setText ("I'm unicode áéíóú");
}

请注意文字字符串作为元素node“我是 unicode áéíóú”中的文本。当我向服务器请求这个时,我获得了一个带有 UTF-8 编码(OK)的 HTTP 响应,XML 定义说它是 UTF-8,但是节点的文本将被编码为 ISO-8859-1(这是我的猜测,因为当我使用 Firefox 更改编码时,该字符串看起来不错)。

那么,为什么当定义应该是 UTF-8 时,dom4j 将文字字符串编码为 ISO?我的代码有问题吗?谢谢

4

1 回答 1

1

解决了!因为 dom4j 的一些错误,element.setText()不关心指定的编码并且document.asXML()会返回一个 ISO 字符串,所以我修改了该行如下:

response.getOutputStream().write(document.asXML().getBytes("UTF-8"));

一切正常..

于 2012-09-26T17:46:17.310 回答