JAVA/SERVLETがUTF-8でCSVファイルをエクスポートする際に文字化けしが発生する問題と解決

1235 ワード

以下の方法でCSVファイルをエクスポートすると、Excelで開くと文字化けしてしまうことがあります.

OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");  
//         
result = (String)contentMap.get(RESPONSE_RESULT);  
resp.setHeader("Content-Disposition", "attachment;filename=test.csv");  
osw.write(result);  
osw.flush();

しかし、NOTEPAD++で開くと、表示は正常であることがわかりました.そして、NOTEPADD++の「フォーマット」ツールバーでファイルコードを調べてみると「UTF-8 BOMなしでエンコード」ということに気づき、それを「UTF-8でエンコード」に変更してみてEXCELで開くとOK、すべてが正常に表示されます.では、EXCELはUTF-8形式のCSVファイルをサポートしていることを示します.また、以上のようにして導出したファイルにはBOM情報が含まれていないことも説明します(BOM情報については自分でグーグルしてください).では、次にEXCELを正しく表示させるためには、出力する内容にBOMマークを手動で付けることが明らかになります.具体的な方法は以下の通りです.

OutputStreamWriter osw = new OutputStreamWriter(resp.getOutputStream(), "UTF-8");  
//         
result = (String)contentMap.get(RESPONSE_RESULT);  
resp.setHeader("Content-Disposition", "attachment;filename=test.csv");  
osw.write(new String(new byte[] { (byte) 0xEF, (byte) 0xBB,(byte) 0xBF }));  
osw.write(result);  
osw.flush();


宣言:この文書の概要http://rainbow702.iteye.com/blog/1426354#commentsあ、ありがとう!