java - 如何让 XSLT 在 Java 中返回 UTF-8

标签 java xml xslt encoding utf-8

我正在尝试让我的 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 进行转换。

最佳答案

这几乎肯定是问题所在:

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

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

如果您无论如何都要写入Writer,为什么要开始写入ByteArrayOutputStream?为什么不直接转到 Writer

但是,最好直接写入响应的输出流 (response.getOutputStream()),并设置响应的内容类型以指示它是 UTF-8。

请注意,如果您真的想事先将结果作为 String 获取,请使用 StringWriter。写入 ByteArrayOutputStream 然后转换为字符串是没有意义的。

关于java - 如何让 XSLT 在 Java 中返回 UTF-8,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13468612/

相关文章:

xslt - 如何将元素插入到 xslt 中先前创建的元素中?

java - Java删除同名文件

java - Flume java.lang.IllegalStateException : File has changed size since being read

xml - 在 XML 中,原子节点与叶节点是一回事吗?

xml - 需要使用 Powershell 帮助写入 Machine.config

objective-c - 使用 iOS SDK 4.2 的 UIWebView 中的 XSLT

java - 如何从传入 vector 和表面法线中找到折射 vector ?

java - JUnit 测试方法未执行

java - 从平面文件读取数据并将其写入 xml 的最佳方法

xml - 无法理解如何在格式编号 XML 中使用逗号