码迷,mamicode.com
首页 > 编程语言 > 详细

【Java】Java URLDecoder异常Illegal hex characters in escape (%)

时间:2019-11-08 12:00:00      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:cte   cap   实现   正则表达式:   正则   请求   有一个   意思   java   

  如果收到的HTTP请求参数(URL中的GET请求)中有一个字符串,是中文,比如“10%是黄段子”,服务器段使用URLDecoder.decode就会出现此异常。URL只能使用英文字母、阿拉伯数字和某些标点符号,不能使用其他文字和符号。如果内容中存在中文,必须要进行编解码。“10%是黄段子”转码过后是“10%25%E6%98%AF%E9%BB%84%E6%AE%B5%E5%AD%90%”被用来作为转义字符使用。

  上面的字符串中‘%‘是一个中文字符‘是‘,而转换的实现是将%后面的两个字符一起转为一个16进制数。拿"%是"来转换数字,肯定会有NumberFormatException异常。

  类似的如果请求字符串中有‘+‘,也会有问题。因为‘+‘被当做空格使用了。一个解决办法就是将%替换为%25。

public static String replacer(StringBuffer outBuffer) {
  String data = outBuffer.toString();
  try {
     data = data.replaceAll("%(?![0-9a-fA-F]{2})", "%25");
     data = data.replaceAll("\\+", "%2B");
     data = URLDecoder.decode(data, "utf-8");
  } catch (Exception e) {
     e.printStackTrace();
  }
  return data;
}

这里使用了一个特殊正则表达式:零宽负向先行断言(zero-widthnegative lookahead assertion),模式为(?!pattern),代表字符串中的一个位置,紧接该位置之后的字符序列不能匹配pattern。%(?![0-9a-fA-F]{2})意思是‘%‘开始,但是后面两个字符不是数字,也不是字母。

或者使用POST请求,将参数参加到body中而不是请求url拼接

【Java】Java URLDecoder异常Illegal hex characters in escape (%)

标签:cte   cap   实现   正则表达式:   正则   请求   有一个   意思   java   

原文地址:https://www.cnblogs.com/jxd283465/p/11819119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!