如何让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
然后转换为字符串是没有意义的。