关于UTF-8下的CSV文件被EXCEL打开时乱码的问题
在TOMCAT下输出CSV文件,用EXCEL打开时乱码,具体乱码的原因如下:
1、如果系统的file.encoding为GBK时,输出CSV文件后,用EXCEL打开正常
2、如果系统的file.encoding为UTF-8时,输出CSV文件后,用EXCEL打开为乱码
try{
Properties properties = System.getProperties();
String encodingStr = properties.getProperty("file.encoding");
System.out.println("file.encoding--------->"+encodingStr);
jsonData = "测试";
HttpServletResponse response = ServletActionContext.getResponse();
OutputStream ouputStream = response.getOutputStream();
// 设置相应参数,以附件形式保存Excel
response.setContentType("application/vnd.excel"); //msexcel vnd.excel
response.setCharacterEncoding("UTF-8");
//加上UTF-8文件的标识字符 ,否则有些EXCEL会乱码,或者转换成ansi
//其实经过测试和这句根本没有最用,乱码的核心在于file.encoding
//ouputStream.write(new byte[]{(byte)0xEF,(byte)0xBB,(byte)0xBF});
//有编码问题
response.setHeader("Content-Disposition", "attachment; filename=\""
+URLEncoder.encode(excelFilaName, "UTF-8")+ ".csv\"");
ouputStream.write(jsonData.getBytes());
ouputStream.close();
}catch(Exception e){
e.printStackTrace();
}
乱码的核心问题知道了,但是不清楚如何进行转化,测试了多种方式还是不对。
另补充说明:
1、其实乱码与不乱码导出的文件在16进制下来看,内容是不同的。
2、网上说添加(byte)0xEF,(byte)0xBB,(byte)0xBF其实根本没用的,不乱码的CSV文件就是去掉(byte)0xEF,(byte)0xBB,(byte)0xBF也能正常显示。