免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 7122 | 回复: 11
打印 上一主题 下一主题

用js进行url编码后用php反解以及用php实现js的escape功能函数总结 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-15 17:36 |只看该作者 |倒序浏览
这次第一次用smarttemplate这个模板,比smarty小巧了很多,但也有些不方便的地方。

smarty可以直接对url进行编码, 比如<!--{$var|urlencode}-->

但在smarttemplate里面就好像没有,由于链接是由js提交的,而不是表单提交,所以不能自动编码。

解决办法: 采用js对URL中的汉字进行escape编码。

  1. <a href="" onclick="window.open('product_list.php?p_sort='+escape('PHP开发资源网'));">
复制代码


这样点击链接后的效时:

http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51


生成了这样的效果, 很明显用PHP的urldecode()或者base64_decode()是无法反解的。

解决方法, 用PHP写一个反解函数:

  1. function js_unescape($str)
  2. {
  3.         $ret = '';
  4.         $len = strlen($str);

  5.         for ($i = 0; $i < $len; $i++)
  6.         {
  7.                 if ($str[$i] == '%' && $str[$i+1] == 'u')
  8.                 {
  9.                         $val = hexdec(substr($str, $i+2, 4));

  10.                         if ($val < 0x7f) $ret .= chr($val);
  11.                         else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
  12.                         else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));

  13.                         $i += 5;
  14.                 }
  15.                 else if ($str[$i] == '%')
  16.                 {
  17.                         $ret .= urldecode(substr($str, $i, 3));
  18.                         $i += 2;
  19.                 }
  20.                 else $ret .= $str[$i];
  21.         }
  22.         return $ret;
  23. }
复制代码



注意JS编码会自动转换成为UTF-8, 所以必须进行编码转换才能得到正确的结果,否则会中文乱码。

代码如下:

  1. print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
复制代码


到此我们就成功地反解了js的escape编码了。
如下:
PHP开发资源网


另外我找到个用PHP实现js的escape编码的函数:

  1. function phpescape($str)
  2. {
  3.          $sublen=strlen($str);
  4.          $retrunString="";
  5.          for ($i=0;$i<$sublen;$i++)
  6.          {
  7.                   if(ord($str[$i])>=127)
  8.                   {
  9.                            $tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
  10.                            //$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打开此项
  11.                            $retrunString.="%u".$tmpString;
  12.                            $i++;
  13.                   } else {
  14.                            $retrunString.="%".dechex(ord($str[$i]));
  15.                   }
  16.          }
  17.          return $retrunString;
  18. }
复制代码


大家是否遇到过这种问题呢?

论坛徽章:
0
2 [报告]
发表于 2007-11-15 17:37 |只看该作者
很久没冒泡了。。。。

论坛徽章:
0
3 [报告]
发表于 2007-11-16 08:35 |只看该作者
看完,....学习...  顶一个

论坛徽章:
0
4 [报告]
发表于 2007-11-16 09:43 |只看该作者
不知道原理。。。呵呵 学识尚浅

论坛徽章:
0
5 [报告]
发表于 2007-11-16 10:45 |只看该作者
我用的都是UTf-8

所以js用escape
PHP接收时,无需什么转换!

论坛徽章:
0
6 [报告]
发表于 2007-11-16 22:33 |只看该作者
不错不错。正遇到类似问题。

论坛徽章:
0
7 [报告]
发表于 2007-11-18 21:56 |只看该作者
function phpescape($str)
{
         $sublen=strlen($str);
         $retrunString="";
         for ($i=0;$i<$sublen;$i++)
         {
                  if(ord($str[$i])>=127)
                  {
                           $tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
                           //$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);//window下可能要打开此项
                           $retrunString.="%u".$tmpString;
                           $i++;
                  } else {
                           $retrunString.="%".dechex(ord($str[$i]));
                  }
         }
         return $retrunString;
}


$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
这个是什么意思啊 ? 有什么用,为什么说在win下打开此项啊 ?

[ 本帖最后由 koocy 于 2007-11-18 21:57 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2007-11-18 22:08 |只看该作者
我前两天试着用smarttemplate+xajax,发现很好玩
用PHP自动生成js的感觉真好

论坛徽章:
0
9 [报告]
发表于 2007-11-19 18:13 |只看该作者
原理就是UTF8编码的字符,转成16进制,前面加%u,能被JS的escape反解
如果是转成10进制,前面加 &# 后面加 ;,这个数字串可以直接在IE上显示汉字 ,如 ࡪ

如果要转回来呢,就先转到2进制,然后用 pack() 打包,PHP就可以得到 unescape 的效果了

$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
这句话的目的是因为高低位对调的问题,如果你显示得不对,可以试试去掉注释

最后,其实这个问题很简单,用16进制编辑器打开一个有汉字,然后用个计算器算来算起的....

论坛徽章:
0
10 [报告]
发表于 2007-11-19 22:54 |只看该作者
学习楼主和楼上的..
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP