导致URLDecoder UTF-8解码崩溃的%u开头符号是什么?应使用何种编码?
解决Java URLDecoder解码%u格式字符串崩溃的问题
Hey there! Let's break down what's happening here and how to fix it.
为什么会抛出IllegalArgumentException?
你遇到的%u6EDA%u52A8%u8F74%u627F这种格式不是标准的URL编码(application/x-www-form-urlencoded),而是JavaScript风格的Unicode转义格式。
Java的URLDecoder只认标准URL编码——也就是%XX形式(XX是两位十六进制数,对应UTF-8字节)。当它看到%u开头的字符串时,会误以为%后面应该跟两位十六进制字符,结果遇到了u,直接触发非法参数异常,也就是你看到的:
Exception in thread "main" java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in escape (%) pattern - For input string: "u6"
这个编码的含义是什么?
每个%uXXXX对应一个Unicode字符,XXXX是该字符的十六进制Unicode码点。比如:
%u6EDA→ Unicode码点0x6EDA→ 中文“滚”%u52A8→0x52A8→ “动”%u8F74→0x8F74→ “条”%u627F→0x627F→ “包”
解码后完整内容是:滚动条承包
怎么成功解码这种格式?
有两种实用方法,都能轻松解决这个问题:
方法1:用Apache Commons Text工具类(推荐)
如果你的项目已经引入了Apache Commons Text依赖,可以直接用StringEscapeUtils解析转义序列:
import org.apache.commons.text.StringEscapeUtils; public class DecodeTest { public static void main(String[] args) { String encodedStr = "%u6EDA%u52A8%u8F74%u627F"; // 把%uXXXX替换成Java识别的\uXXXX转义格式 String javaEscaped = encodedStr.replaceAll("%u([0-9A-Fa-f]{4})", "\\\\u$1"); // 解析转义得到中文 String decodedStr = StringEscapeUtils.unescapeJava(javaEscaped); System.out.println(decodedStr); // 输出:滚动条承包 } }
方法2:手动用正则解析(无需第三方库)
如果不想引入依赖,可以自己写正则匹配并转换:
import java.util.regex.Matcher; import java.util.regex.Pattern; public class ManualDecode { public static void main(String[] args) { String encodedStr = "%u6EDA%u52A8%u8F74%u627F"; // 匹配所有%uXXXX格式的字符串 Pattern unicodePattern = Pattern.compile("%u([0-9A-Fa-f]{4})"); Matcher matcher = unicodePattern.matcher(encodedStr); StringBuffer result = new StringBuffer(); while (matcher.find()) { // 提取四位十六进制码点,转成char char unicodeChar = (char) Integer.parseInt(matcher.group(1), 16); matcher.appendReplacement(result, String.valueOf(unicodeChar)); } matcher.appendTail(result); System.out.println(result.toString()); // 输出:滚动条承包 } }
总结
%uXXXX是JS环境常用的Unicode编码方式,和标准URL编码不兼容,所以URLDecoder处理不了- 解码核心是将
%uXXXX转换为对应的Unicode字符,两种方法都能实现,按需选择即可
内容的提问来源于stack exchange,提问作者Sahand
相关产品推荐
相关产品推荐

