问题
最近再写一个SpringBoot+Vue的前后端分离项目的时候,后端直接向前端返回字符串,结果前端前端接收之后中文就出现乱码:
使用postman测试如图:
后端代码:
@Slf4j
@RestController
@RequestMapping("/api/websites")
public class WebSitesController {
@Value("${blog.websites.path}")
private String websitesFilePath;
@GetMapping("/get")
public String get() {
String content = FileUtil.readString(websitesFilePath, CharsetUtil.UTF_8);
log.info("websites : {}", content);
return content;
}
}
解决方法
编码问题一开始就想到是注入HttpServletResponse
对象,于是我将代码代码修改为如下:
@GetMapping("/get")
public String get(HttpServletResponse res) {
String content = FileUtil.readString(websitesFilePath, CharsetUtil.UTF_8);
res.setContentType("text/html;charset=utf-8");
res.setCharacterEncoding("utf-8");
log.info("websites : {}", content);
return content;
}
但是仍然乱码,查询资料之后发现,在这里设置编码格式是无效的,可以用如下方式设置:
1. 使用produces参数
在GetMapping
注解上使用produces
参数设置编码格式
再次测试,乱码问题解决。
2. 封装Map
想到如果将想要返回的数据封装成对象之后,再结合@ResponseBody
注解就不会出现乱码,于是尝试将数据封装成Map:
@GetMapping("/get")
public Map<String, String> get() {
String content = FileUtil.readString(websitesFilePath, CharsetUtil.UTF_8);
log.info("websites : {}", content);
return MapUtil.of("content", content);
}
完美解决: