You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:15:08