Tomcat 9.0.63中REST接口传输ḗ字符被解析为?的问题求助
解决Tomcat 9.0.63中REST接口接收'ḗ'字符变为'?'的问题
核心原因及修复方案
1. 全局配置Tomcat请求编码
Tomcat默认请求编码为ISO-8859-1,无法支持ḗ这类Unicode字符,需修改server.xml的Connector配置:
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" URIEncoding="UTF-8" useBodyEncodingForURI="true"/>
URIEncoding="UTF-8":统一GET请求参数编码useBodyEncodingForURI="true":让POST请求体使用和URI相同的编码
2. 接口层面强制设置编码
若全局配置不生效,可在REST方法中显式指定请求编码:
@PostMapping("/your-api") public ResponseEntity<?> processRequest(HttpServletRequest request) throws UnsupportedEncodingException { request.setCharacterEncoding("UTF-8"); String content = request.getParameter("target-content"); // 后续业务处理 }
3. 确保客户端请求编码正确
发送请求时,必须在Content-Type头中指定UTF-8编码:
Content-Type: application/json; charset=UTF-8
如果是表单提交,需添加accept-charset="UTF-8"属性。
4. 配置字符集过滤器
在项目的web.xml中添加字符集过滤器,强制所有请求使用UTF-8:
<filter> <filter-name>CharacterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> <init-param> <param-name>forceEncoding</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>CharacterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
5. 配置JVM启动参数
在Tomcat的启动脚本(catalina.sh/catalina.bat)中添加JVM参数,确保全局字符集为UTF-8:
# Linux/macOS JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8" # Windows set JAVA_OPTS=%JAVA_OPTS% -Dfile.encoding=UTF-8
6. 验证数据库存储编码(若涉及持久化)
如果字符需要存入数据库,需确保:
- 数据库表及字段编码为
utf8mb4(支持全Unicode字符) - JDBC连接URL添加编码参数:
jdbc:mysql://localhost:3306/your_db?useUnicode=true&characterEncoding=UTF-8
内容的提问来源于stack exchange,提问作者Jakub
相关产品推荐
相关产品推荐

