我怎样才能XSLT在Java返回UTF-8(How can I get XSLT to return

2019-08-02 23:20发布

我试图让我的XSL脚本使用UTF-8编码工作。 像AAO和希腊字母字符,只是把像垃圾。 要得到它的工作的唯一办法是,如果我把结果写入到一个文件中。 如果我把它写入输出流它只返回垃圾(System.out的工作,但可能是因为它的beeing重定向到一个文件)。

结果需要从一个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" />

什么是得到这个工作的正确方法是什么? 我使用撒克逊进行了改造,如果可能有任何帮助。

Answer 1:

这是几乎可以肯定的问题:

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

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

如果你打算写一个Writer ,无论如何,你为什么出发写入ByteArrayOutputStream ? 为什么不直接去Writer

这将是更好的,但是,写直奔响应的输出流( response.getOutputStream()并设置响应的内容类型,以表明它是UTF-8。

请注意,如果你真的想要得到的结果作为一个String请先用StringWriter 。 有以书面形式向一个没有点ByteArrayOutputStream ,然后转换为字符串。



文章来源: How can I get XSLT to return UTF-8 in Java