【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
2016-05-06 10:39
741 查看
Java调用 URLDecoder.decode(str, "UTF-8"); 抛出以上的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下,
上面的字符串中'%'是一个中文字符'是',而转换的实现是将%后面的两个字符一起转为一个16进制数。拿"%是"来转换数字,肯定会有NumberFormatException异常。
类似的如果请求字符串中有'+',也会有问题。因为'+'被当做空格使用了。
一个解决办法就是将%替换为%25。
这里使用了一个特殊正则表达式:零宽负向先行断言(zero-width negative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是'%'开始,但是后面两个字符不是数字,也不是字母。
上面的字符串中'%'是一个中文字符'是',而转换的实现是将%后面的两个字符一起转为一个16进制数。拿"%是"来转换数字,肯定会有NumberFormatException异常。
类似的如果请求字符串中有'+',也会有问题。因为'+'被当做空格使用了。
一个解决办法就是将%替换为%25。
data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25"); data = data.replaceAll("\\+", "%2B"); data = URLDecoder.decode(data, "utf-8");
这里使用了一个特殊正则表达式:零宽负向先行断言(zero-width negative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是'%'开始,但是后面两个字符不是数字,也不是字母。
相关文章推荐
- ValueStack与Struts2标签-day5
- java中根据hibernate配置文件自动建表
- Java练习题
- 蓝桥杯 幂一矩阵 2014年JavaB组决赛第5题
- springMVC dao层中通过反射获取entityClass
- java I/O(一)——基本操作&&java.util.zip压缩
- Java虚拟机参数设置问题
- Java Future和Callable介绍
- Java多线程之wait(),notify(),notifyAll()
- JAVA来读取大文本文件
- Java问题汇总
- Springlake-01 介绍&功能&安装
- Java web 开发环境配置
- Eclipse默认配色的恢复方法
- Spring4 整合 Hibernate3 基本使用(通过注入 SessionFactory)
- 69道Spring面试题和答案
- 69道Spring面试题和答案
- Java 中 List 与 HashSet 的对比
- java.lang.IllegalStateException: commit already called
- Eclipse开发Web常见异常