在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也能正常显示。
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也能正常显示。
解决方案 »
- 我在网上找的图片验证码,我这个页面的值<input type="text">怎么传不到Servlet里面去,请高手瞧瞧
- 跪求eclipse与myeclipse中truts2.0 中的标签问题!
- Hibernate调用SQL2005存储过程(多个结果集)
- 请问怎么样将一个字符串从一个jsp页面传递到另一个jsp页面?
- 请问怎么用jsp取得客户端的系统时间和ip?
- JSP分页显示在下菜鸟请高手们帮忙错了不知道怎么改帮我一下
- 请问怎样在tomcat中加sql server2000的驱动
- 用poi,在excel中合并单元格后,怎样让数据居中写入合并的单元格
- Tomcat的缓存问题,更新了bean,但它还是用旧的,在线等!
- 项目运行报错,请大家给看看
- 急求:前台form传值到后台Action接收不到报错如下:
- 哪位大侠帮我个忙,我不知道怎么用Struts对用户进行非空验证?
再说,已经指明了编码是UTF-8了,我觉得再加BOM就重复了1、其实乱码与不乱码导出的文件在16进制下来看,内容是不同的。
这个貌似表明了写入excel文件时内容的编码就不一样了
因此 导出的CSV在记事本等看是正常的,但是在EXCEL是乱码,说白了估计的EXCEL的问题.
file.encoding--------->utf-8时jsonData.getBytes()相当于jsonData.getBytes("utf-8")
所以出现乱码了
直接改为ouputStream.write(jsonData.getBytes("GB18030"));就可以解决了