【发布时间】:2020-05-24 08:38:32
【问题描述】:
我需要在我的 Spring Boot 应用程序中创建和下载一个 utf-8 编码的 csv 文件。 问题是 Excel 2019 无法正确打开它,您可能会猜到所有这些 utf-8 字符都显示为奇怪的符号。我在某处读到将 BOM 字符添加到 csv 文件的开头可以解决问题。我是手动完成的,它确实有效。但是,当我按如下方式使用 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
}
我用一些 HEX 查看器工具检查了生成的 test.csv 文件,看看文件开头是否有那些 BOM 字节.很奇怪他们不在那里。尽管我明确地将它们写入文件,但它们并没有在文件开头写入。非常非常奇怪。 有人可以帮忙吗?!
【问题讨论】:
-
你为什么不试试 outputStream.print 呢?不确定 BOM 字符的写入是否会从第一个字节开始并清除 response.getOutputStream()...
-
@JGFMK 我也尝试了打印方法,但得到了相同的行为。当我在写那些 BOM 字节之前写一些像“H”这样的 ascii 字符时,这变得更加奇怪。在这种情况下,我可以按照我编写它们的确切顺序在 HEX 查看器中查看它们。
标签: java spring-boot servlets utf-8 byte-order-mark