java - HttpServletResponse 无法设置字符集

标签 java character-encoding export-to-csv content-type java-ee-6

我在为我在 Web 应用程序上创建的 CSV 文件设置字符集时遇到问题(在 Tomcat9 服务器上的 Windows 笔记本电脑上进行测试)。 这就是我所做的:

byte[] data = result.toString().getBytes();
ByteArrayOutputStream outStream = new ByteArrayOutputStream(data.length);
outStream.write(data, 0, data.length);
response.setContentType("text/csv;charset=UTF-8");
response.setHeader("Expires", "0");
response.setHeader("Cache-Control", "must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setHeader("Content-Disposition", "attachment; filename=\"AEP_report.csv\"");
response.setContentLength(outStream.size());
ServletOutputStream responseOutStream = response.getOutputStream();
outStream.writeTo(responseOutStream);
outStream.flush();
outStream.close();
responseOutStream.flush();
responseOutStream.close();

我尝试将编码更改为windows-1252等。当然,我生成文件没有问题,但是当我转到 Notepad++ 并更改编码以查看它是否有效时,我总是得到相同的结果。 对于 ANSI 一切看起来都不错,但是当我更改为 UTF-8 时,它显示的是这样的:

wrong encoding

何时应显示“Cürey”。

显然该文件始终是在 ANSI 上创建的。

然后我真正的问题来了,但基本上和以前一样。在我的质量系统(在 Linux 服务器上)上,情况类似,代码不会影响编码,但显然文件总是使用 UTF-8 编码创建。我想这取决于操作系统。 所以我想我的错误在于定义内容类型。我的定义有误吗?

预先感谢您的帮助。

最佳答案

因此,在执行一些测试后,我意识到问题在于,对于这样的内容(作为 ByteArrayOutputStream 生成的 String),定义编码的时刻是当你进行此转换时。

因此只需将编码作为参数添加到第一行代码的方法中即可。

result.toString().getBytes("UTF-8");

那么你不需要再次定义字符集

response.setContentType("text/csv")

关于java - HttpServletResponse 无法设置字符集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60552104/

相关文章:

python - 从 Flask 以 CSV 形式返回 Numpy 数组

MySQL 加载数据文件错误(附有)

java - 如何删除 Intellij 2019.1 中光标后面的行注释?

java - 将 .txt 解析为 .csv

python - 获取 magic line/shebang 中指定的编码(从模块内)

php - 特殊字符变成问号php html

java - 图像调整大小以适应 JPanel

java - 了解 JVM GC

Python 编码声明似乎被忽略了?

bash - 在 "\copy"psql 命令行中使用 sql 文件