Java 带条纹/Tomcat的流式CSV编码错误

Java 带条纹/Tomcat的流式CSV编码错误,java,servlets,character-encoding,Java,Servlets,Character Encoding,实际上,我正在尝试流式传输CSV文件。我将编码设置为windows-1252,但它似乎仍然作为UTF-8文件流传输 final String encoding = "windows-1252"; exportResolution = new StreamingResolution(builder.getContentType() + ";charset=" + encoding.toLowerCase()) { @Override public voi

实际上,我正在尝试流式传输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只是将内容流式传输到outputstream(通过分页和db调用,这需要一些时间)

它在本地(jetty插件)+dev(tomcat)和firefox/chrome中都不起作用

我没有测试过,但工作人员告诉我,如果我们不流式传输内容,但在从db加载了所有我们想要的对象后,我们一次就编写了文件,效果会更好

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

顺便说一句,我的标题:

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

问题在于
writeExportStream(操作系统,编译器)方法。我们看不到它正在执行什么编码操作,但我猜它正在编写UTF-8数据


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

  • 告诉客户端响应文本的编码方式(通过标题)
  • 以匹配的编码(例如,通过写入器)对写入客户端的数据进行编码
  • 步骤1正在正确执行。步骤2可能是错误的来源

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


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

    请参阅我的标题。我刚刚被告知应该使用编写器而不是OutputStream进行测试。实际上writeExportStream从DB读取数据并将其放入流中。(DB是UTF8)@Sebastien Lorber-我已经澄清了我的答案,但是代码中发生转码错误的部分并不存在。确实如此。罪犯在
    writeExportStream
    内。假设您使用
    builder.toString().getBytes()
    获取要写入的字节,那么此时将使用默认平台编码将字符转换为字节。在这种情况下,您希望改用
    getBytes(“CP-1252”)
    。或者更好,只需提供
    getWriter()
    ,因为您毕竟想写字符,而不是字节。谢谢,这是我刚刚做的,而且很有效。是的,代码是getBytes。。。