在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.   

    这个三个字节是BOM(字节序标记)的utf8实现,BOM的使用是optional的,本身也是不被推荐的
    再说,已经指明了编码是UTF-8了,我觉得再加BOM就重复了1、其实乱码与不乱码导出的文件在16进制下来看,内容是不同的。
    这个貌似表明了写入excel文件时内容的编码就不一样了
      

  2.   

    楼上的说的对,其实说白了乱码与不乱码的文件在16进制下来看,内容就是不同的。
    因此 导出的CSV在记事本等看是正常的,但是在EXCEL是乱码,说白了估计的EXCEL的问题.
      

  3.   

    用统一的编码,建议都用UTF-8
      

  4.   

    这种情况好处理吧
    file.encoding--------->utf-8时jsonData.getBytes()相当于jsonData.getBytes("utf-8")
    所以出现乱码了
    直接改为ouputStream.write(jsonData.getBytes("GB18030"));就可以解决了