【问题标题】:How can I get XSLT to return UTF-8 in Java如何让 XSLT 在 Java 中返回 UTF-8
【发布时间】:2012-11-08 05:58:49
【问题描述】:

我正在尝试让我的 XSL 脚本使用 UTF-8 编码。 åäö 和希腊字符之类的字符就像垃圾一样出现。让它工作的唯一方法是将结果写入文件。如果我将它写入输出流,它只会返回垃圾(System.out 有效,但这可能是因为它被重定向到文件)。

结果需要从 servlet 返回,请注意这不是 servlet 配置问题。我可以从 servlet 返回一个带有希腊字符的硬编码字符串,它工作正常,所以这是转换的问题。

这是我当前的(简化的)代码。

protected void doGet(final HttpServletRequest request, final HttpServletResponse response) throws ServletException,
IOException {
    try {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html; charset=UTF-8");

        final TransformerFactory factory = this.getFactory();

        final File inFile = new File("infile.xml");
        final File xslFile = new File("template.xsl");
        final File outFile = new File("outfile.html");

        final Templates templates = factory.newTemplates(new StreamSource(xslFile));
        final Transformer transformer = templates.newTransformer();
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");

        final InputStream in = new FileInputStream(inFile);
        final StreamSource source = new StreamSource(in);

        final StreamResult result1 = new StreamResult(outFile);
        final StreamResult result2 = new StreamResult(System.out);
        final ByteArrayOutputStream out = new ByteArrayOutputStream();
        final StreamResult result3 = new StreamResult(out);

        //transformer.transform(source, result1);
        //transformer.transform(source, result2);
        transformer.transform(source, result3);

        final Writer writer = response.getWriter();
        writer.write(new String(out.toByteArray()));
        writer.close();
        in.close();

    } catch (final TransformerConfigurationException e) {
        e.printStackTrace();
    } catch (final TransformerException e) {
        e.printStackTrace();
    }
}

另外,我的 XSL 脚本包含以下内容

<xsl:output method="html" omit-xml-declaration="yes" encoding="UTF-8" indent="yes" />

什么是让它工作的正确方法?如果这可能有任何帮助,我正在使用 Saxon 进行转换。

【问题讨论】:

    标签: java xml xslt encoding utf-8


    【解决方案1】:

    这几乎肯定是问题所在:

    writer.write(new String(out.toByteArray()));
    

    您已将文本仔细编码为 UTF-8,然后您将使用平台默认编码转换为字符串。您几乎应该从不使用使用平台默认编码的String 构造函数和方法。即使您想要使用该编码,也要明确地这样做。

    如果你还是要写信给Writer,为什么要开始写ByteArrayOutputStream?为什么不直接去Writer

    不过,最好直接写入响应的输出流 (response.getOutputStream()),并将响应的内容类型设置为 UTF-8。

    请注意,如果您真的想事先获得String 的结果,请使用StringWriter。写一个ByteArrayOutputStream然后转换成一个字符串是没有意义的。

    【讨论】:

    • 谢谢,您为我指明了正确的方向。我刚刚发现ByteArrayOutputStreamout.toString("UTF-8") 的方法,所以在那之后它就起作用了。我不能立即使用响应流,因为我还有其他一些与结果有关的东西,但我想我现在可以开始了。谢谢!
    • 我正要回答这个问题,然后我看到了@jonSkeet 0_0
    • 如果您希望将输出作为字符串由 Java 应用程序处理,只需通过提供 Writer 让转换器输出字符。要求它向 byteOutputStream 写入字节,然后将字节解码为字符,只会产生复杂性和潜在的错误。
    猜你喜欢
    • 2011-09-07
    • 2020-10-18
    • 1970-01-01
    • 2018-06-14
    • 2012-03-11
    • 2014-11-02
    • 2012-10-09
    • 2010-12-11
    相关资源
    最近更新 更多