用js进行url编码后用php反解以及用php实现js的escape功能函数总结


Posted in PHP onFebruary 08, 2010

smarty可以直接对url进行编码, 比如<!--{$var|urlencode}-->
但在smarttemplate里面就好像没有,由于链接是由js提交的,而不是表单提交,所以不能自动编码。
解决办法: 采用js对URL中的汉字进行escape编码。
<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写一个反解函数:

function js_unescape($str) 
{ 
$ret = ''; 
$len = strlen($str); 
for ($i = 0; $i < $len; $i++) 
{ 
if ($str[$i] == '%' && $str[$i+1] == 'u') 
{ 
$val = hexdec(substr($str, $i+2, 4)); 
if ($val < 0x7f) $ret .= chr($val); 
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f)); 
else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f)); 
$i += 5; 
} 
else if ($str[$i] == '%') 
{ 
$ret .= urldecode(substr($str, $i, 3)); 
$i += 2; 
} 
else $ret .= $str[$i]; 
} 
return $ret; 
}

注意JS编码会自动转换成为UTF-8, 所以必须进行编码转换才能得到正确的结果,否则会中文乱码。
代码如下:
print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
到此我们就成功地反解了js的escape编码了。
如下:
引用:PHP开发资源网
另外我找到个用PHP实现js的escape编码的函数:
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; 
}

大家是否遇到过这种问题呢?
PHP 相关文章推荐
隐藏你的.php文件的实现方法
Mar 19 PHP
php 高效率写法 推荐
Feb 21 PHP
php小技巧 把数组的键和值交换形成了新的数组,查找值取得键
Jun 02 PHP
PHP数组和explode函数示例总结
May 08 PHP
postfixadmin忘记密码后的修改密码方法详解
Jul 20 PHP
PHP实现上一篇下一篇的方法实例总结
Sep 22 PHP
PHP判断是手机端还是PC端 PHP判断是否是微信浏览器
Mar 15 PHP
php cli模式下获取参数的方法
May 05 PHP
php判断文件上传图片格式的实例详解
Sep 30 PHP
PHP实现Huffman编码/解码的示例代码
Apr 20 PHP
php5.6.x到php7.0.x特性小结
Aug 17 PHP
PHPstorm启用自动换行的方法详解(IDE)
Sep 17 PHP
Zend framework处理一个http请求的流程分析
Feb 08 #PHP
PHP函数常用用法小结
Feb 08 #PHP
在PHP中养成7个面向对象的好习惯
Jan 28 #PHP
php 正确解码javascript中通过escape编码后的字符
Jan 28 #PHP
php读取xml实例代码
Jan 28 #PHP
通过具体程序来理解PHP里面的抽象类
Jan 28 #PHP
认识并使用PHP超级全局变量
Jan 26 #PHP
You might like
执行、获取远程代码返回:file_get_contents 超时处理的问题详解
2013/06/25 PHP
PHP字符串的连接的简单实例
2013/12/30 PHP
PHP遍历XML文档所有节点的方法
2015/03/12 PHP
yii2框架中使用下拉菜单的自动搜索yii-widget-select2实例分析
2016/01/09 PHP
js 变量类型转换常用函数与代码[比较全]
2009/12/01 Javascript
javascript检查表单数据是否改变的方法
2013/07/30 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
js获取或设置当前窗口url参数的小例子
2013/10/14 Javascript
jquery实现弹出窗口效果的实例代码
2013/11/28 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
jquery对复选框(checkbox)的操作汇总
2016/01/13 Javascript
DWR中各种java方法的调用
2016/05/04 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
关于List.ToArray()方法的效率测试
2016/09/30 Javascript
给easyui的datebox控件添加清空按钮的实现方法
2016/11/09 Javascript
利用jQuery插件imgAreaSelect实现图片上传裁剪(同步显示图像位置信息)
2016/12/02 Javascript
Vue.js 单页面多路由区域操作的实例详解
2017/07/17 Javascript
基于Vue单文件组件详解
2017/09/15 Javascript
JavaScript模拟实现自由落体效果
2018/08/28 Javascript
详解vue-cli@2.x项目迁移日志
2019/06/06 Javascript
ES6基础之字符串和函数的拓展详解
2019/08/22 Javascript
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
2015/04/24 Python
python使用PyGame模块播放声音的方法
2015/05/20 Python
从局部变量和全局变量开始全面解析Python中变量的作用域
2016/06/16 Python
对Python3使运行暂停的方法详解
2019/02/18 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
python使用time、datetime返回工作日列表实例代码
2019/05/09 Python
python装饰器常见使用方法分析
2019/06/26 Python
使用virtualenv创建Python环境及PyQT5环境配置的方法
2019/09/10 Python
Django中使用MySQL5.5的教程
2019/12/18 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
工作经验交流材料
2014/12/30 职场文书
放射科岗位职责
2015/02/14 职场文书
2015年发展党员工作总结报告
2015/03/31 职场文书
2015年中学校长工作总结
2015/05/19 职场文书
JavaScript流程控制(分支)
2021/12/06 Javascript