1. import java.util.BitSet;
  2.  
  3. public class UrlEncoderUtils {
  4.  
  5. private static BitSet dontNeedEncoding;
  6.  
  7. static {
  8. dontNeedEncoding = new BitSet(256);
  9. int i;
  10. for (i = 'a'; i <= 'z'; i++) {
  11. dontNeedEncoding.set(i);
  12. }
  13. for (i = 'A'; i <= 'Z'; i++) {
  14. dontNeedEncoding.set(i);
  15. }
  16. for (i = '0'; i <= '9'; i++) {
  17. dontNeedEncoding.set(i);
  18. }
  19. dontNeedEncoding.set('+');
  20. /**
  21. * 这里会有误差,比如输入一个字符串 123+456,它到底是原文就是123+456还是123 456做了urlEncode后的内容呢?<br>
  22. * 其实问题是一样的,比如遇到123%2B456,它到底是原文即使如此,还是123+456 urlEncode后的呢? <br>
  23. * 在这里,我认为只要符合urlEncode规范的,就当作已经urlEncode过了<br>
  24. * 毕竟这个方法的初衷就是判断string是否urlEncode过<br>
  25. */
  26.  
  27. dontNeedEncoding.set('-');
  28. dontNeedEncoding.set('_');
  29. dontNeedEncoding.set('.');
  30. dontNeedEncoding.set('*');
  31. }
  32.  
  33. /**
  34. * 判断str是否urlEncoder.encode过<br>
  35. * 经常遇到这样的情况,拿到一个URL,但是搞不清楚到底要不要encode.<Br>
  36. * 不做encode吧,担心出错,做encode吧,又怕重复了<Br>
  37. *
  38. * @param str
  39. * @return
  40. */
  41. public static boolean hasUrlEncoded(String str) {
  42.  
  43. /**
  44. * 支持JAVA的URLEncoder.encode出来的string做判断。 即: 将' '转成'+' <br>
  45. * 0-9a-zA-Z保留 <br>
  46. * '-','_','.','*'保留 <br>
  47. * 其他字符转成%XX的格式,X是16进制的大写字符,范围是[0-9A-F]
  48. */
  49. boolean needEncode = false;
  50. for (int i = 0; i < str.length(); i++) {
  51. char c = str.charAt(i);
  52. if (dontNeedEncoding.get((int) c)) {
  53. continue;
  54. }
  55. if (c == '%' && (i + 2) < str.length()) {
  56. // 判断是否符合urlEncode规范
  57. char c1 = str.charAt(++i);
  58. char c2 = str.charAt(++i);
  59. if (isDigit16Char(c1) && isDigit16Char(c2)) {
  60. continue;
  61. }
  62. }
  63. // 其他字符,肯定需要urlEncode
  64. needEncode = true;
  65. break;
  66. }
  67.  
  68. return !needEncode;
  69. }
  70.  
  71. /**
  72. * 判断c是否是16进制的字符
  73. *
  74. * @param c
  75. * @return
  76. */
  77. private static boolean isDigit16Char(char c) {
  78. return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F');
  79. }
  80. }

  

如何判断某String是否经过urlEncoder.encode过的更多相关文章

  1. URLEncoder.encode 和 URLDecoder.decode 处理url的特殊参数

    在使用 url 的 queryString 传递参数时,因为参数的值,被DES加密了,而加密得到的是 Base64的编码字符串,类似于: za4T8MHB/6mhmYgXB7IntyyOUL7Cl++ ...

  2. 关于 web中 使用 java.net.URLEncoder.encode 要编码两次呢 , js的encodeURIComponent 同理

    因为在jsp中对中文进行了编码的时候用的是UTF-8的编码方式,而在servlet中调用request.getParameter();方法的时候使用服务器指定的原始编码格式(ISO-8859-1)自动 ...

  3. URLEncoder.encode问题

    遇到java里的URLEncoder.encode方法编码后与javascript的encodeURIComponent方法的结果有点不一样,找了一下资料,原来URLEncoder实现的是HTML形式 ...

  4. java中的URLEncoder.encode对应JS中用decodeURIComponent,js和java编码,解码

    用get请求传中文,经常搞到乱码,这几天搞搞这个东西,总结一下,以方便以后处理这类的问题. Java代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多 ...

  5. javaWeb中URLEncoder.encode编码需要调用两次

    今天碰到一个问题,在Controller类中一个方法跳转到该类中的另一个方法,带着中文参数,在跳转之前对该参数进行编码: msg = java.net.URLEncoder.encode(msg,&q ...

  6. 为什么java的web开发中URLEncoder.encode方法要为什么要调用两次

    一: 我们先看2个编码的情况 String name=java.net.URLEncoder.encode("测试", "UTF-8"); System.out ...

  7. URLEncoder.encode 使用心得

    1.解决接口GET请求中:参数包含中文问题? 通过URLEncoder.encode 可以解决.我此次使用的utf-8编码,所以对中文进行urlencode  编码 而在服务器短 使用的tomcat ...

  8. 中文乱码在java中URLEncoder.encode方法要调用两次解决

    中文乱码在java中URLEncoder.encode方法要调用两次解决 一.场景: 1.我在客户端要通过get方式调用服务器端的url,将中文参数做utf-8编码,需要在js中两次的进行编码,服务器 ...

  9. HttpPost过程中使用的URLEncoder.encode(something, encode)

    URLEncoder.encode("刘美美", "utf-8").toString()       =     %E5%88%98%E7%BE%8E%E7%B ...

随机推荐

  1. C#反射Assembly 详细说明,有项目例子

    1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...

  2. SSH框架-Struts2基础-Action

    Struts2的目录结构: 解压apps目录下的struts2-blank.war: 仿照这个最基本的项目,拷贝相关文件: 1.拷贝apps/struts2-blank/WEB-INF/classes ...

  3. 【BZOJ】2018: [Usaco2009 Nov]农场技艺大赛(暴力)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2018 精度问题我也是醉了.. #include <cstdio> #include &l ...

  4. VC中怎么输入特殊符号(如平方、立方等下标符号)

    同在列表控件里显示汉字一样,直接把输入法里特殊字符放进一个数组里,然后再赋值:CString F[]={"m²","∑","±"," ...

  5. 蓝桥杯 第四届C/C++预赛真题(5) 前缀判断(水题)

    题目标题:前缀判断 如下的代码判断 needle_start指向的串是否为haystack_start指向的串的前缀,如不是,则返回NULL. 比如:"abcd1234" 就包含了 ...

  6. 理解PHP中会话控制

    如果以前没有接触过建站或网络编程,只是从头开始学PHP,以及用PHP来建立动态站点,那么会话(SESSION)对于初学者就有点难理解.那么到底什么是会话呢?理解一个概念需要从它产生的背景或问题出发,所 ...

  7. Direct Line Guidance Odometry论文阅读笔记

    摘要: 本文特色:使用线引导关键点的选择.本文提出这个的论点是:线上的点比图像的其他部分的点更好,而且线上存在更好的关键点.选择线上的点可以筛选过滤掉不太明显的点,从而提高效率. 点和线: 系统使用点 ...

  8. 巨蟒python全栈开发-第11天 第一类对象 闭包 迭代器

    一.今日主要内容总览(重点) 1.第一类对象->函数名=>变量名 (1)函数对象可以像变量一样进行赋值 (2)还可以作为列表的元素进行使用 (3)还可以作为返回值返回 (4)还可以作为参数 ...

  9. 转!!springmvc学习

    springmvc学习 https://www.cnblogs.com/baiduligang/p/4247164.html

  10. 转!!Tomcat网站上的core和deployer的区别

    转自:https://www.cnblogs.com/guxia/p/6678184.html 8.5.13 Please see the README file for packaging info ...