2017-04-26 10 views
0

問題は次のとおりです。 DocumentBuilderFactoryによって作成されたxmlファイルがあります。 それから、このファイルをブラウザでダウンロードする必要があります。JSFで右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 \ symbolsとしてエクスポートされます。これを修正するには? ファイルの他の部分が正しくエクスポートされます。

+0

HttpServletResponseの文字エンコードがUTF-8に設定されていますか? – axemoi

答えて

1

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はすべてのエンコーディングの複雑さを処理する必要があります。

+0

ありがとうございます。実際にはこれが助けになりました:xml.getBytes(StandardCharsets.UTF_8)。 – ILya

関連する問題