使用Stripes / Tomcat对流式CSV进行错误编码

时间:2011-02-01 16:32:10

标签: java servlets character-encoding

其实我正在尝试流式传输CSV文件。我将编码设置为windows-1252,但它似乎仍然以UTF-8文件的形式流式传输。

   final String encoding = "windows-1252";
   exportResolution = new StreamingResolution(builder.getContentType() + ";charset=" + encoding.toLowerCase()) {
        @Override
        public void stream(HttpServletResponse response) throws Exception {
            // Set response headers
            response.setHeader("Cache-control", "private, max-age=0");
            response.setCharacterEncoding(encoding);
            OutputStream os = response.getOutputStream();
            writeExportStream(os,builder);
        }
    }.setFilename(filename);

writeExportStream只是将内容流式传输到输出流(使用分页和db调用,需要一些时间)

它在本地(jetty插件)+ dev(tomcat)无法使用firefox / chrome

我没有测试过,但是工作人员告诉我,当我们不流式传输内容时它会更好用,但是我们在从db中加载了我们想要的所有objets之后,我们一次编写了该文件。

有人知道发生了什么吗?感谢

我的标题:

HTTP/1.1 200 OK
Content-Language: fr-FR
Content-Type: text/csv;charset=windows-1252
Content-Disposition: attachment;filename="export_rshop_01-02-11.csv"
Cache-Control: private, max-age=0
Transfer-Encoding: chunked
Server: Jetty(6.1.14)

我希望文件能够在windows-1252中的excel中导入但是我不能,它只是在utf8中打开而我的标题是windows-1252

1 个答案:

答案 0 :(得分:2)

问题在于writeExportStream(os,builder);方法。我们无法看到它正在执行的编码操作,但我猜它正在编写UTF-8数据。


输出操作需要执行两个编码任务:

  1. 告诉客户端响应文本的编码(通过标题)
  2. 使用匹配的编码(例如,通过编写器)对写入客户端的数据进行编码
  3. 第1步正确完成。第2步可能是错误的来源。

    如果使用provided writer,它将以适当的响应编码对字符数据进行编码。

    如果通过原始字节流(getOutputStream())写入预编码数据,则需要确保此过程使用相同的编码。