关于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也能正常显示。
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文件时内容的编码就不一样了
再说,已经指明了编码是UTF-8了,我觉得再加BOM就重复了
1、其实乱码与不乱码导出的文件在16进制下来看,内容是不同的。
这个貌似表明了写入excel文件时内容的编码就不一样了
作者: dracularking 发布时间: 2011-12-12
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28