javascript - 在Java中发送带有BOM的UTF-8编码的CSV文件

标签 javascript java excel csv byte-order-mark

我正在编写一个带有一些重音符号的 CSV 文件,以 UTF-8 编码。问题是,当我尝试用 Excel 打开该文件时,内容仍然困惑。我必须使用 Sublime Text 打开文件并将其保存为“UTF-8 with BOM”才能获得正确的文件(将文件保存为简单的 UTF-8 不起作用)。我读了很多 SO 问题并尝试应用这些解决方案,但没有一个起作用。我无法确定这是我编写文件时的后端问题,还是下载文件时的前端问题。

Spring Controller

@Transactional
@RequestMapping(method = RequestMethod.GET, path = "/exportStreets")
public void exportStreets(@RequestParam(value = "city", required = false) Long cityId, HttpServletResponse response) throws IOException {
    // Do some stuff ...

    response.setContentType("text/csv");
    response.setCharacterEncoding("UTF-8");
    response.setHeader("Content-Disposition", "attachment; filename=\"export_streets.csv\"");
    this.exportService.exportStreetsToCsv(toExport, response.getWriter());
}

导出服务

public void exportStreetsToCsv(Set<Street> streets, PrintWriter writer) throws IOException {
    writer.print('\ufeff'); // Write BOM

    CSVFormat csvFormat = CSVFormat.EXCEL.withQuoteMode(QuoteMode.ALL).withDelimiter(';');
    CSVPrinter csvPrinter = new CSVPrinter(writer, csvFormat);

    // Print records

    csvPrinter.flush();
    csvPrinter.close();
}

前端

const blobFile = new Blob([response.data], { type: 'text/csv' });
this.FileSaver.saveAs(blobFile, 'test.csv');

我设法通过在保存文件之前添加 BOM 来使其工作,但这是一个我想避免的丑陋修复。另外,由于某种原因,修复后我的 CSV 文件的第一行有双引号。修复方法如下:

const blobFile = new Blob([new Uint8Array([0xEF, 0xBB, 0xBF]), response.data], { type: 'text/csv;charset=utf-8' });

最佳答案

我没有做太多事情来解决我的问题,而且我仍然不确定出了什么问题。我只需将 PrintWriter 更改为 Writer,并在我的 javascript 代码中添加字符集。

后端服务

public void exportStreetsToCsv(Set<Street> streets, Writer writer) throws IOException {
    writer.write('\uFEFF'); // Write BOM
    // ...

前端下载

const blobFile = new Blob([response.data], { type: 'text/csv;charset=utf-8' });
this.FileSaver.saveAs(blobFile, 'test.csv');

关于javascript - 在Java中发送带有BOM的UTF-8编码的CSV文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48952319/

相关文章:

java - selenium 找不到出现在我的浏览器中的 iframe

excel - 在范围内移动三角形

vba - 如何将图片添加到Powerpoint演示文稿图片占位符?

java - 在 Firebase 数据库中编写规则

java - 复制数据集中的行并更改值

excel - 根据文件名将Excel文件合并为一个新的Excel文件

javascript - 同源政策目的可疑

javascript - 在 textarea 输入中美化 json 数据

javascript - JavaScript 关联数组是如何工作的?

javascript - httpChannel.redirectTo() 无限加载