Spring Boot GET请求cp1252编码QueryParam乱码如何获取原始未解码字符串
解决方案
问题根因
Spring Boot(内置Tomcat容器)默认使用UTF-8对URL Query参数进行解码,你传入的参数%F1是cp1252编码下的ñ字符,UTF-8编码规则中不存在对应单字节0xF1的合法字符,因此会被替换为乱码�。你之前重新编码得到%3F就是因为乱码字符�本身编码后就是问号对应的%3F。
方案1:修改容器Query参数默认编码(全局生效)
如果你的服务所有GET请求的Query参数都是用cp1252编码,直接修改内置Tomcat的配置即可,在application.properties/application.yml中添加配置:
server.tomcat.uri-encoding=CP1252 server.tomcat.use-body-encoding-for-uri-query-parameters=false
配置后Spring会直接用cp1252解码参数,你直接用@RequestParam拿到的t参数就是正确的a coruña,不需要额外处理。
方案2:手动获取原始Query字符串解析(按需使用)
如果你只有部分接口需要接收cp1252编码的参数,不想修改全局配置,或是需要完全未解码的原始参数值,可以直接从HttpServletRequest中获取未解码的原始Query串自行处理:
// Spring Boot 3.x用jakarta,2.x版本替换为javax.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletRequest; import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; @RestController public class TestController { @GetMapping("/test") public String test(HttpServletRequest request) throws Exception { // 获取原始未解码的QueryString,示例值为"c=es&t=a%20coru%F1a" String rawQuery = request.getQueryString(); Map<String, String> params = new HashMap<>(); // 手动拆分参数 for (String param : rawQuery.split("&")) { String[] keyValue = param.split("=", 2); if (keyValue.length == 2) { // 若需要原始编码值直接取keyValue[1]即可,无需调用decode String value = URLDecoder.decode(keyValue[1], "CP1252"); params.put(keyValue[0], value); } } String t = params.get("t"); return t; } }
内容的提问来源于stack exchange,提问作者Luisao
相关产品推荐
相关产品推荐

