Я пытаюсь заставить свой XSL-скрипт работать с кодировкой UTF-8. Такие иероглифы, как åäö и греческие иероглифы, просто появляются как мусор. Единственный способ заставить его работать - записать результат в файл. Если я пишу его в выходной поток, он возвращает только мусор (System.out работает, но это может быть потому, что он перенаправляется в файл).
Результат должен быть возвращен сервлетом, и обратите внимание, что это не проблема конфигурации сервлета. Я могу вернуть жестко закодированную строку с греческими символами из сервлета, и она работает нормально, так что это проблема с преобразованием.
Вот мой текущий (упрощенный) код.
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 для преобразования, если это может помочь.