前言
最近碰到了这样的一个问题
服务器这边 设置了 encoding 为 utf8, 然后 服务器这边响应了 中文数据回来
客户端那边 拿到的依然是乱码, 然后 查看响应头 Content-Type 中 encoding 为 ISO-8859-1
但是 疑惑的就是, 服务器这边明明配置了 encoding
出现问题的用例
出现问题的代码如下
@RestController
@RequestMapping("/HelloWorld")
public class HelloWorldController {
@PostMapping("/flowResponse")
public void flowResponse(HttpServletResponse response) throws Exception {
PrintWriter pw = response.getWriter();
response.setContentType("text/event-stream");
response.setCharacterEncoding("utf8");
for (int i = 1; i < 3; i++) {
pw.println(String.format("第%s行数据", i));
pw.flush();
Thread.sleep(1000);
}
}
}
客户端这边 消费, 展示如下

为什么 response 设置 encoding 不成功?
我们看一下 response.setCharacterEncoding 的地方
首先是 response.getWriter 的时候设置了一个默认值 ISO-8859-1

在业务代码中 response.setCharacterEncoding("utf8") 的时候, 发现已经调用过了 response.getWriter
直接忽略了本次的 response.setCharacterEncoding("utf8")
所以说 客户端那边拿到的编码 依然是 ISO-8859-1

response.getWriter 的实现如下, 设置了 usingWriter

问题的解决
调整一下 response.getWriter 和 response.setCharacterEncoding("utf8") 的顺序就可以了
服务器这边的处理更新为如下

然后客户端这边输出正常

完