+ -
当前位置:首页 → 问答吧 → 关于UTF-8下的CSV文件被EXCEL打开时乱码的问题

关于UTF-8下的CSV文件被EXCEL打开时乱码的问题

时间:2011-12-11

来源:互联网

在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也能正常显示。

作者: appleIIappleII   发布时间: 2011-12-11

这个三个字节是BOM(字节序标记)的utf8实现,BOM的使用是optional的,本身也是不被推荐的
再说,已经指明了编码是UTF-8了,我觉得再加BOM就重复了

1、其实乱码与不乱码导出的文件在16进制下来看,内容是不同的。
这个貌似表明了写入excel文件时内容的编码就不一样了

作者: dracularking   发布时间: 2011-12-12