如何让XSLT在Java中返回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脚本包含以下内容

  

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

这几乎肯定是问题所在:

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

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

如果你打算写一个Writer ,为什么你开始写一个ByteArrayOutputStream ? 为什么不直接去Writer

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

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