Http传输转码问题(java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern)

当一个请求以HTTP方式传输参数的时候,会进行字符转义

--浏览器对汉字的通过某种编码方式进行url编码转义,转译成为ascii以便下一步。这里就是get post请求涉及到的地方,get肯定url编码转义,post中的urlencode与之类似,formdata猜测应该未转义,json猜测应该url编码;

如一个相应信息中含有‘%’的时候

event_name=龙虎榜&estimate_name=日涨幅偏离值达到7%

转化代码为: 

String jsonResponse = URLDecoder.decode(responseBufferString, "UTF-8");

报错信息为:

java.lang.IllegalArgumentException: URLDecoder: Incomplete trailing escape (%) pattern
    at java.net.URLDecoder.decode(URLDecoder.java:187)

出现这个错误的主要原因是,在接收字段aMoney的值时,浏览器传过来的是这样的:

%E6%97%A5%E6%B6%A8%E5%B9%85%E5%81%8F%E7%A6%BB%E5%80%BC%E8%BE%BE%E5%88%B07%

我们知道中文的话,浏览器肯定会转码,但是转码后的格式一般都是%两个字符,也就是百分号后面,接英文字母或者数字!

但是假设参数中原本就有百分号%的话,这时浏览器不会处理,接着再使用decode进行解码时,会出错,因为java程序认为后面应该还有两个字符才对,结果没有。。。

解决办法
只需要把单独出现的%替换成转码后的字符就行了,也就是%25。

这里强调下,网上很多的改法如下:

estimateName = estimateName.replaceAll("%", "%25");

上面这种写法是错误的,因为其把正确的都替换掉了。 
这里我们需要明白,要替换掉的是单独出现的百分号,而不是全部的百分号

正确改法

estimateName = estimateName.replaceAll("%(?![0-9a-fA-F]{2})", "%25");

上的字符串就会解码成如下格式(重点看最后):

%E6%97%A5%E6%B6%A8%E5%B9%85%E5%81%8F%E7%A6%BB%E5%80%BC%E8%BE%BE%E5%88%B07%25


讲解下%(?![0-9a-fA-F]{2}): 
这是个正则表达式,含义是:不匹配%后面两位为数字或字母(包括大小写)的字符;这样就把正确的排除掉了,剩下的就是需要匹配替换的。

原文:https://blog.csdn.net/u013066244/article/details/79552732 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值