java 如何判断 一个 字符串 是否 被 urlencode 过?为了防止重复endcode
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
public static String getUrlEncode(String str) { if (str == null || "".equals(str)) { return ""; } try { str = URLEncoder.encode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; } public static String getUrlDecode(String str) { if (str == null || "".equals(str)) { return ""; } try { str = URLDecoder.decode(str, "UTF-8"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return str; } public static boolean isUrlEncode(String en){ if (StringUtils.isEmpty(en)){ return false; } return !(en.length()==getUrlDecode(en).length()); }
urldecode一下,decode前后一致即未encode过,前后不一致即encode过。(具体原理可参看URLDecoder的源码)
看了其他几位同学的回答。简单的补充一下:
1、对于"a-z", "A-Z", "0-9", ".", "-", "*", "_",encode/decode前后不产生任何变化,所以实际上无需判断;
2、" "被转换成"+",如果原字符串本来就含有"+",上述方法无效;
3、其他的字符,根据不同的字符集先被转换成一到多个byte,然后每个byte被表示成类似"%xy"的字符串,其中xy是该byte值的16进制表示形式。所以对于原字符串本来含有"%"或者"%xy",上述方法也无效,对于"%xy",如果xy为非法字符,则会抛出IllegalArgumentException。
所以如果需要得到精确的结果,需要自己另加额外的控制标志位。