Java 使用Spring引导和HttpServletResponse下载utf-8编码的csv文件时出现问题

Java 使用Spring引导和HttpServletResponse下载utf-8编码的csv文件时出现问题,java,spring-boot,servlets,utf-8,byte-order-mark,Java,Spring Boot,Servlets,Utf 8,Byte Order Mark,我需要在我的spring boot应用程序中创建并下载一个utf-8编码的csv文件。 问题是Excel 2019无法正确打开,您可能猜到,所有这些utf-8字符都显示为奇怪的符号。我在某个地方读到,在csv文件的开头添加BOM字符可以解决这个问题。我是手工做的,它实际上可以工作。但是,当我按如下方式使用HttpServletResponse时,它不起作用: HttpServletResponse response = ...;//coming from rest api call respon

我需要在我的spring boot应用程序中创建并下载一个utf-8编码的csv文件。 问题是Excel 2019无法正确打开,您可能猜到,所有这些utf-8字符都显示为奇怪的符号。我在某个地方读到,在csv文件的开头添加BOM字符可以解决这个问题。我是手工做的,它实际上可以工作。但是,当我按如下方式使用HttpServletResponse时,它不起作用:

HttpServletResponse response = ...;//coming from rest api call
response.addHeader("Content-Type", "text/csv; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=test.csv");
response.setCharacterEncoding("UTF-8");

/*write o response file csvWriter and flush/close it*/
try {
    ServletOutputStream outputStream = response.getOutputStream();
    outputStream.write(new byte[]{239, 187, 191});//add utf-8 BOM bytes
    outputStream.write("some,utf8,text".getBytes());
    outputStream.close();
} catch (IOException e) {
    //handle exception
}
我用一些十六进制查看器工具检查了生成的test.csv文件,以查看文件开头是否有这些BOM字节。很奇怪,他们不在那里。虽然我显式地将它们写入文件,但它们并没有在文件的开头写入。非常非常严厉。
有人能帮忙吗

我遇到了同样的问题,通过使用CSV格式的标题找到了解决方案:

CSVPrinter printer = new CSVPrinter(httpServletResponse.getWriter(), CSVFormat.EXCEL.withHeader("\ufeff");

在字节顺序标记之后,我们仍然可以在标题中添加其他字符串,它仍然有效。

为什么不试试outputStream.print?不确定BOM字符的写入是否从第一个字节开始并清除响应。getOutputStream…@JGFMK我也尝试了print方法,但得到了相同的行为。当我在写入BOM字节之前写入一些ascii字符(如“H”)时,这种情况变得更加奇怪。在本例中,我可以在HEX viewer中按照我编写它们的确切顺序查看它们。