java 下载文件wps可以正常打开,使用office打开乱码,普通用户及程序员解决方案

分析

乱码,一般都是中文乱码,英文正常显示。导致这个问题有且仅有一个原因,那就是保存文件的编码格式和打开文件的编码格式不同。

解决

知道问题的原因就好解决了,我们可以打开这个文件,查看其编码格式。以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软件很厉害,兼容性好。

  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值