Spring Boot REST接口中文乱码主因是字符编码未对齐,涉及客户端提交、服务端接收与响应三环节;需配置URI编码、Content-Type charset、RestTemplate默认字符集及文件名RFC 5987编码。

Spring Boot 中 REST 接口出现中文乱码,多数情况不是“接口写错了”,而是请求或响应环节的字符编码未对齐。核心问题集中在三处:客户端提交参数时编码不对、服务端接收时未指定解码方式、服务端返回时未声明响应编码。下面从实际开发中最常踩坑的几个点展开说明。
接口接收中文参数乱码
GET 请求的中文参数(如 URL 中的 query 参数)在 Tomcat 8.5+ 默认使用 UTF-8 解码,但若部署在旧版容器或被反向代理(如 Nginx)拦截后未配置编码,就可能按 ISO-8859-1 解析,导致乱码。POST 请求体中的中文(尤其是 form-data 或 raw JSON)则依赖 Content-Type 是否带 charset=UTF-8。
- 确保 Controller 方法参数用 @RequestParam 或 @RequestBody 正确标注,避免用 HttpServletRequest.getParameter() 手动取值
- 在 application.yml 中显式配置 URI 编码:
server: tomcat: uri-encoding: UTF-8 - 如果是前端 AJAX 调用,确认请求头设置了 Content-Type: application/json; charset=UTF-8
接口返回中文乱码
浏览器或调用方看到中文变问号或方块,大概率是响应头缺失 Content-Type: application/json; charset=UTF-8,导致客户端按默认编码(如 ISO-8859-1)解析 UTF-8 字节流。
- 全局生效:在 application.yml 添加
spring: http: encoding: force: true charset: UTF-8 - 对单个接口,可在 @RequestMapping 或 @GetMapping 上加 produces 属性:
@GetMapping(value = "/api/data", produces = "application/json;charset=UTF-8") - 若使用 ResponseEntity,手动设置 header:
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
RestTemplate 调用第三方接口时乱码
你用 RestTemplate 调用百度 AI、支付平台等外部接口,返回中文乱码,根本原因常是对方响应头没带 charset(如只写 Content-Type: application/json),而 RestTemplate 默认用 ISO-8859-1 解码响应体字节流,再转 String 就已损坏。
- 自定义 RestTemplate,添加 StringHttpMessageConverter 并设为 UTF-8:
restTemplate.getMessageConverters().stream()
.filter(converter -> converter instanceof StringHttpMessageConverter)
.findFirst().ifPresent(c -> ((StringHttpMessageConverter) c).setDefaultCharset(StandardCharsets.UTF_8)); - 更稳妥的做法:不用 String.class 接收,改用 ResponseEntity
,再手动按 UTF-8 构造字符串:
String body = new String(response.getBody(), StandardCharsets.UTF_8); - 若需复用 JSON 反序列化,可搭配 Jackson2ObjectMapperBuilder 设置 UTF-8 编码
文件下载时中文文件名乱码
通过 @ResponseBody 返回文件流并设置 Content-Disposition 时,中文文件名在 Chrome、Edge 下正常,但在 Firefox 或旧版 IE 中显示为乱码,是因为 filename 参数不支持直接传中文。
- 不要用:
Content-Disposition: attachment; filename="报告2026年10月.pdf" - 应改用标准的 filename* 参数(RFC 5987):
Content-Disposition: attachment; filename="report.pdf"; filename*=UTF-8''%E6%8A%A5%E5%91%8A2026%E5%B9%B410%E6%9C%88.pdf - Java 中可用 URLEncoder.encode(fileName, "UTF-8") 生成百分号编码,并拼接成 filename* 字段


















