开发避坑指南(62):解决URLDecoder:Illegal hex characters in escape (%) pattern 异常
异常信息
java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "食品"at java.net.URLDecoder.decode(URLDecoder.java:194)
异常分析
在对请求参数进行URLDecoder时发生上述异常。请求参数值为"85%食品级柠檬酸",请求参数包含百分号。该异常是由于URLDecoder在解码时遇到非法十六进制字符导致的,具体表现为字符串中的"%"被误认为是URL编码的起始符号,但后续字符"食品"不符合十六进制编码格式。URLDecoder要求%后必须跟随两个十六进制字符(0-9/a-f/A-F)才能正常解码。
解决办法
使用正则表达式预处理字符串,将“%”替换成 URL 编码中的百分号编码“%25”,替换后不需要跟两个十六进制字符,确保百分号正确传递。
String valueStr = value.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
替换逻辑分解
(1)% 匹配
匹配字符串中的百分号字符,作为替换的基准点。
(2)(?![0-9a-fA-F]{2}) 负向先行断言
检查 % 后是否不跟随两位十六进制字符(0-9、a-f、A-F)。若不符合(如 %x、% 单独出现),则触发替换;若符合(如 %20),则保留原样。
(3)%25 替换值
将未编码的 % 替换为其URL编码形式 %25。