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

如何在Java中解码含未转义%的x-www-form-urlencoded数据

解决包含未转义%的x-www-form-urlencoded字符串解码问题

你的输入字符串不符合标准x-www-form-urlencoded格式——规范要求%必须后跟两个十六进制字符表示转义,但你的字符串里存在单独的%(比如示例中的5%%20里第一个%),导致标准解码工具抛出异常。

解决方案思路

先预处理字符串,把所有**未构成有效转义的%**替换成%25(即%的标准转义形式),再用Java标准的URLDecoder进行解码。

Java 实现代码

import java.net.URLDecoder;
import java.nio.charset.StandardCharsets;

public class CustomUrlDecode {
    public static void main(String[] args) {
        String input = "APL%205%%20off";
        
        // 正则替换:匹配所有后面不跟两个十六进制字符的%,替换为%25
        String processedInput = input.replaceAll("%(?![0-9A-Fa-f]{2})", "%25");
        
        // 标准URL解码
        String decoded = URLDecoder.decode(processedInput, StandardCharsets.UTF_8);
        
        System.out.println(decoded); // 输出:APL 5% off
    }
}

关键细节解释

  • 正则表达式%(?!([0-9A-Fa-f]{2}))使用负向预查,只匹配那些后面没有紧跟两个十六进制字符的%,确保不会破坏已经合法的转义(比如%20、%25)。
  • 预处理后,示例字符串APL%205%%20off会被转换为APL%205%25%20off,此时所有%都符合标准转义规则,URLDecoder可以正常解码。
  • 对于Java 7及以下版本,StandardCharsets.UTF_8可以替换为字符串常量"UTF-8"。

边界情况测试

  • 输入"%test" → 预处理后"%25test" → 解码结果"%test"
  • 输入"test%" → 预处理后"test%25" → 解码结果"test%"
  • 输入"a%25b%%c" → 预处理后"a%25b%25%25c" → 解码结果"a%b%c"

内容的提问来源于stack exchange,提问作者Dilip Jain

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 11:02:44