分析
乱码,一般都是中文乱码,英文正常显示。导致这个问题有且仅有一个原因,那就是保存文件的编码格式和打开文件的编码格式不同。
解决
知道问题的原因就好解决了,我们可以打开这个文件,查看其编码格式。以csv文件为例,使用记事本打开,文件---->另存为 就可以看到保存文件的编码格式了。
可以看到,这个文件是用utf-8保存的,为什么用wps可以打开,微软office 打开就乱码呢?
wps 打开该文件的编码格式为utf-8,而office 打开该文件的编码格式为ANSI。
1.普通用户解决方案
如果你是普通用户,只想用office打开这个文件,使用记事本将这个文件打开,在另存为中设置文件的编码格式为 ANSI并保存。再次使用wps 和 office打开,都不乱码。
2.程序员解决方案
如果你是程序员,这个是文件程序写入的,每次用office就乱码,那肯定是不行的。
总不能让用户不使用office、或者每次设置一下编码再打开吧
下载文件方法中,写入文件内容时设置编码格式为GBK
//设置文件下载编码为 GBK
@RequestMapping("/testDownloadFile.do")
public void testDownloadFile(HttpServletResponse response){
String filename=emailGradeTask.getName()+".csv";
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes("UTF-8"),"ISO-8859-1"));
//设置响应的编码格式为GBK
response.setCharacterEncoding("GBK");
OutputStream toClient = new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/octet-stream");
String resultDataPath = emailGradeStat.getResultDataPath();
//从分布式文件存储系统上下载流文件
InputStream input = GetClient.doGet(resultDataPath);
byte[] bytes=null;
BufferedReader reader=new BufferedReader(new InputStreamReader(input));
String line=null;
while ((line=reader.readLine())!=null){
line+=","+"\n";
//以GBK编码写入文件内容
bytes = line.getBytes("GBK");
toClient.write(bytes);
}
toClient.flush();
toClient.close();
}
测试:使用wps和office都可以不乱码打开,测试通过!
延伸
其实这个问题是wps和office两款软件的兼容性引起的。wps的兼容性更好,不管你文件是用什么格式保存的,它都可以识别并用你保存的格式打开;office 没有识别文件保存编码,都是以ANSI这一种方式打开。可以说office很傲慢,忽视用户体验,也可以说国产wps软件很厉害,兼容性好。