JAVA/SERVLETがUTF-8でCSVファイルをエクスポートする際に文字化けしが発生する問題と解決
以下の方法でCSVファイルをエクスポートすると、Excelで開くと文字化けしてしまうことがあります.
しかし、NOTEPAD++で開くと、表示は正常であることがわかりました.そして、NOTEPADD++の「フォーマット」ツールバーでファイルコードを調べてみると「UTF-8 BOMなしでエンコード」ということに気づき、それを「UTF-8でエンコード」に変更してみてEXCELで開くとOK、すべてが正常に表示されます.では、EXCELはUTF-8形式のCSVファイルをサポートしていることを示します.また、以上のようにして導出したファイルにはBOM情報が含まれていないことも説明します(BOM情報については自分でグーグルしてください).では、次にEXCELを正しく表示させるためには、出力する内容にBOMマークを手動で付けることが明らかになります.具体的な方法は以下の通りです.
宣言:この文書の概要http://rainbow702.iteye.com/blog/1426354#commentsあ、ありがとう!
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あ、ありがとう!