java - 在 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 文件中打印这些字符的方法。
解决方案
此问题的原因是 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");
推荐阅读
- python - Scikit学习KerasClassifer评估错误
- javascript - 嵌套地图上的setState打破ReactJS中的原点对象结构
- go - Why is the heap in Go executable?
- javascript - AudioContext.decodeAudioData(...) 不能在 iPhone 上工作,但在其他地方工作
- python-3.x - 如何将变量放入json对象?
- javascript - 如何在 JavaScript 中按字母顺序(升序和降序)排序
- php - 试图获取非对象的属性,但它是一个对象
- c# - 在调用类中获取 EventArgs
- node.js - 安装 ESLint 和 Babel 等插件
- spring-boot - tomcat 抛出一个 IllegalArgumentException