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

appleIIappleII 2011-12-11 09:42:57
在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也能正常显示。
...全文
442 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
appleIIappleII 2011-12-13
  • 打赏
  • 举报
回复
谢谢ZYZ1985,我测试一下
游一游走一走 2011-12-13
  • 打赏
  • 举报
回复
这种情况好处理吧
file.encoding--------->utf-8时jsonData.getBytes()相当于jsonData.getBytes("utf-8")
所以出现乱码了
直接改为ouputStream.write(jsonData.getBytes("GB18030"));就可以解决了
良才2015 2011-12-13
  • 打赏
  • 举报
回复
用统一的编码,建议都用UTF-8
dracularking 2011-12-13
  • 打赏
  • 举报
回复
excel有显示编码设置的吧
appleIIappleII 2011-12-13
  • 打赏
  • 举报
回复
楼上的说的对,其实说白了乱码与不乱码的文件在16进制下来看,内容就是不同的。
因此 导出的CSV在记事本等看是正常的,但是在EXCEL是乱码,说白了估计的EXCEL的问题.
dracularking 2011-12-12
  • 打赏
  • 举报
回复
这个三个字节是BOM(字节序标记)的utf8实现,BOM的使用是optional的,本身也是不被推荐的
再说,已经指明了编码是UTF-8了,我觉得再加BOM就重复了

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

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧