设为首页 收藏本站
查看: 1033|回复: 0

[经验分享] php中urlencode与rawurlencode的区别有那些呢

[复制链接]

尚未签到

发表于 2017-12-30 18:45:12 | 显示全部楼层 |阅读模式
  urlencode 函数:
  返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数,空格则编码为加号(+)。此编码与 WWW 表单 POST 数据的编码方式是一样的,同时与 application/x-www-form-urlencoded 的媒体类型编码方式一样。由于历史原因,此编码在将空格编码为加号(+)方面与 RFC1738 编码(参见 rawurlencode())不同。
  rawurlencode 函数:
  返回字符串,此字符串中除了 -_. 之外的所有非字母数字字符都将被替换成百分号(%)后跟两位十六进制数。这是在 » RFC 3986 中描述的编码,是为了保护原义字符以免其被解释为特殊的 URL 定界符,同时保护 URL 格式以免其被传输媒体(像一些邮件系统)使用字符转换时弄乱。下面我们来看一下例子:
  <?php
  $string = "hello world";
  echo urlencode($string) . '<br/>'; //输出:hello+world
  echo rawurldecode($string) . '<br/>';//输出:hello%20world
  ?>
  具体例子比较:
  <?php
  for ($i = 0x20; $i < 0x7f; $i++) {
  $str .= dechex($i);
  }
  $asscii = pack("H*",$str);
  echo "所有的可打印的asscii字符:(从空格到~)n". $asscii."\n";
  echo "urlencode 的结果:\n".urlencode($asscii);
  echo "\n";
  echo "urlencode 不做编码的字http://www.iyunv.net/符:\n".preg_replace("/%.{2}/","",urlencode($asscii));
  echo "\n";
  echo "rawurlencode 的结果:\n".rawurlencode($asscii);
  echo "\n";
  echo "rawurlencode 不做编码的字符:\n".preg_replace("/%.{2}/","",rawurlencode($asscii));
  echo "\n";
  exit;
  ?>
  输出结果:
  ―――――――――――――――――――――――――――
  所有的可打印的asscii字符:(从空格到~)
  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~
  urlencode 的结果:
  +%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
  urlencode 不做编码的字符:
  +-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
  rawurlencode 的结果:
  %20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
  rawurlencode 不做编码的字符:
  -.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
  比较二者的结果:
  1.  数字、大小写字母都不编码
  2.  减号、点号、下划线  三个不编码
  3. rawurlencode比urlencode多编码一个”加号“
  关于javascript中escape与encodeURIComponent的区别:
  >>> console.log(encodeURIComponent("统一注册1"));
  %E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1
  >>> console.log(escape("统一注册1"));
  %u7EDF%u4E00%u6CE8%u518C1
  <?php
  echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1"));
  echo "\n";
  echo urldecode("%u7EDF%u4E00%u6CE8%u518C1");
  // 使用下面的unescape可以
  //echo iconv("utf-8","gbk",unescape("%u7EDF%u4E00%u6CE8%u518C1");
  exit;
  ?>
  输出结果:
  ======================================
  统一注册1
  %u7EDF%u4E00%u6CE8%u518C1
  ======================================
  结果说明:
  1. encodeURIComponent 总是把输入转换成utf8编码处理的,按字节编码
  2. escape是按照unicode编码处理的,因为它也对url中不安全的字符做了编码,所以也可以在url中做编码使用,但是,服务器端不会自动解码,下面提供一个PHP版的解码函数,是用手册里找的:
  <?php
  function unescape($str) {
  $str = rawurldecode($str);
  preg_match_all("/(?:%u.{4})|&#x.{4};|&#d+;|.+/U",$str,$r);
  $ar = $r[0];
  foreach($ar as $k=>$v) {
  if(substr($v,0,2) == "%u")
  $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,-4)));
  elseif(substr($v,0,3) == "&#x")
  $ar[$k] = iconv("UCS-2","UTF-8",pack("H4",substr($v,3,-1)));
  elseif(substr($v,0,2) == "&#") {
  $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1)));
  }
  }
  return join("",$ar);
  }
  ?>
  >>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
  %20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E
  >>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~"));
  %20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~
  >>> console.log(escape("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));
  *+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
  >>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,""));
  !'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
  结果比较:
  escape未编码的字符: *+-./@_   共7个
  encodeURIComponent未编码的字符: !'()*-._~  共9个

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429828-1-1.html 上篇帖子: 已安装php 编译安装 gd库拓展模块 下篇帖子: 用php进行md5解密的源码,亲测可用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表