使用JSF下载正确的XML编码



问题是以下。有documentBuilderFactory创建的XML文件。然后有必要使用浏览器下载此文件。

代码如下:

StringWriter sw = new StringWriter();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer transformer = tf.newTransformer();
transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "no");
transformer.setOutputProperty(OutputKeys.METHOD, "xml");
transformer.setOutputProperty(OutputKeys.INDENT, "yes");
transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
transformer.transform(new DOMSource(doc), new StreamResult(sw));
String xml = sw.toString();//returns the whole XML but in String format.

HttpServletResponse response = (HttpServletResponse) 
FacesContext.getCurrentInstance().getExternalContext().getResponse();
response.setContentType("text/xml");
response.setHeader("Content-Disposition", "attachment;filename=export.xml");
ServletOutputStream out = response.getOutputStream();
out.write(xml.getBytes());
out.flush();

导出时,我有非拉丁蛋白符号的问题。例如,西里尔单词被导出为 xed xee xe2 符号。如何纠正这个?文件的另一部分被正确导出。

编码可能会出现问题,因为http响应与您写入输出流的字节之间的不匹配。

xml.getBytes()使用您的平台默认编码。它可能是UTF-8,也可能是其他东西,例如ISO-8859-5。改用xml.getBytes(StandardCharsets.UTF_8)。另外,HTTP响应(HTML标头(必须匹配该编码。用内容类型明确指定它:response.setContentType("text/xml; charset=utf-8");

另一方面,您可能只做out.print(xml),而ServletOutputStream应该照顾所有编码的复杂性。

最新更新