首页 > 解决方案 > 在 java 中使用 PrintWriter 将国际字符写入 HttpServletResponse 时,显示为 ä½ å¥½

问题描述

当我们使用 PrintWriter 编写一个从 REST 调用对 HttpServletResponse 的响应得到的中文内容时,就会出现问题。在 servlet 中,当我们使用以下代码时,它会以 CSV 格式下载。下载的 CSV 有 ä½ å¥½。使用的示例代码。

// Sample Chinese content got as response from REST call
String content ="你好";
response.setContentType("text/csv; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=Name.csv");

PrintWriter out = response.getWriter();
out.print(content);
out.flush();
out.close();

有人可以帮助提供一种在 csv 文件中打印这些字符的方法。

标签: javacjkprintwriter

解决方案


此问题的原因是 Excel 和 Java 的规范。Excel 期望 CSV 文件以带有 BOM 的 UTF-8 编码,而 Java 写入不带 BOM 的 UTF-8。

正如@VGR 在评论中所说,您必须\ufeff在 CSV 文件的顶部添加 BOM ( ),如下所示:

response.setContentType("text/csv; charset=UTF-8");
response.addHeader("Content-Disposition", "attachment; filename=Name.csv");
response.getWriter().print("\ufeff");
response.getWriter().print("你好\n");
response.getWriter().print("再见\n");

推荐阅读