You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用ZK的Filedownload.save()时,如何指定文本/CSV文件的编码?

在ZK中实现UTF-16LE编码的CSV文件下载适配Excel

刚好之前踩过类似的坑,ZK的Filedownload.save()默认确实没直接提供设置响应编码的入口,但我们可以通过底层的HTTP响应对象手动配置,再配合BOM处理让Excel正确识别。下面是具体的实现步骤:

  • 第一步:获取当前HTTP响应对象
    在ZK中,我们可以通过Executions工具类拿到原生的HttpServletResponse,用来自定义响应头:

    HttpServletResponse response = (HttpServletResponse) Executions.getCurrent().getNativeResponse();
    
  • 第二步:设置响应头参数
    我们需要指定内容类型为CSV,并明确编码为UTF-16LE,同时设置下载的文件名:

    response.setContentType("text/csv; charset=UTF-16LE");
    response.setHeader("Content-Disposition", "attachment; filename=\"your_report.csv\"");
    
  • 第三步:处理CSV内容的编码与BOM
    Excel识别UTF-16LE编码的CSV时,必须依赖开头的BOM(字节顺序标记)才能正确解析编码,所以我们要在CSV内容前加上0xFF 0xFE的BOM字节,再转成UTF-16LE编码的字节数组:

    String rawCsv = "你的CSV内容,比如:姓名,年龄\n张三,25\n李四,30";
    // 添加UTF-16LE的BOM标记
    byte[] bom = {(byte) 0xFF, (byte) 0xFE};
    byte[] csvBytes = rawCsv.getBytes(StandardCharsets.UTF_16LE);
    // 合并BOM和CSV内容
    byte[] finalContent = ByteBuffer.allocate(bom.length + csvBytes.length)
                                    .put(bom)
                                    .put(csvBytes)
                                    .array();
    
  • 第四步:调用Filedownload完成下载
    最后把处理好的字节数组传给Filedownload.save(),注意这里的内容类型要和响应头保持一致:

    Filedownload.save(finalContent, "text/csv; charset=UTF-16LE", "your_report.csv");
    

这样处理后,浏览器收到的响应会带有正确的编码头,并且CSV内容包含BOM标记,Excel无论是Windows还是Mac版本都能正确识别打开,不会出现乱码问题。

内容的提问来源于stack exchange,提问作者Aaron Digulla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:08:44