采用js对URL中的汉字进行escape编码。
<a href=\"\" onclick=\"window.open(\'product_list.php?p_sort=\'+escape(\'phpstudy\'));\">这样点击链接后的效时:
引用: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, 所以必须进行编码转换才能得到正确的结果,否则会中文乱码。但如果使用UTF-8编码就不用这一步了。
代码如下:print iconv(\'utf-8\', \'gb2312\', js_unescape($_REQUEST[\'p_sort\']));
到此我们就成功地反解了js的escape编码了。
如下:
另外我找到个用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;
}
在json中不支持中文,用它传送中文数据就会出现数据丢失或者乱码,必须在传 送前对要发送的字符串进行编码,由于传送过去需要用js进行数据解析,考虑到js中有unescape函数,故若在php中有个escape函数,对数据 进行编码,在客户端用unescape进行 解码,这样就会方便很多。
先在网上搜索一把,很多用php实现的escape函数,大同小异,比如下面一个:
function phpEscape($str) {
preg_match_all(\"/[\\x80-\\xff].|[\\x01-\\x7f]+/\",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128)
$ar[$k] = rawurlencode($v);
else
$ar[$k] = \"%u\".bin2hex(iconv(\"GB2312\",\"UCS-2\",$v));
}
return join(\"\",$ar);
}
这个函数可以很好的工作,但是,也许有新手不理解这个函数的原理(比如我),用起来总是不放心,现在我就来解释一下这个函数的原理。而且我认为,拿别人的代码来复用,好比站在了巨人的肩膀上,但是若不理解别人的代码,迟早要掉到地面上。
第一句:preg_match_all(\"/[\\x80-\\xff].|[\\x01-\\x7f]+/\",$str,$r);这个是用正则表达式匹配 字符串中所有的字符,[\\x80-\\xff]. 匹配的是汉字,\\x表示匹配字符的16进制编码,[ ] 是类选择符,“.” 表示任意一个字符,这样[\\x80-\\xff].匹配的是两个字符,其中第一个就是16进制从80到ff的字符,而这恰好就是汉字编码的第一个字符。这样 就能完整的匹配一个汉字。关于unicode中汉字的编码,大家可以到网上搜索一下。同理,[\\x01-\\x7f]+英文字符串,因为最早的英文是 ASCII编码,编码值小于128,也就是16进制的从01到7f,\"+\"表示一个或者多个字符,这样[\\x01-\\x7f]+就能匹配连续多个英文字符 串。
$ar = $r[0]; //$r[0]里存放是匹配到的数组
foreach($ar as $k=>$v) {
if(ord($v[0]) < 128) //假如字符编码值小于128,说明是个英文字符
$ar[$k] = rawurlencode($v); //直接用rawurlencode编码
else
$ar[$k] = \"%u\".bin2hex(iconv(\"GB2312\",\"UCS-2\",$v)); //否则的话用iconv函数把汉字转变成ucs-2编码,也就是unicode编码
}
在javascript中就可以用unescape来解码了
\\u0391-\\uFFE5 和\\u4e00-\\u9fa5来匹配中文
但好像前者包含汉字下的A-¥等 后者可能是纯汉字。
其中解码函数为:
function unescape($str) {
$str = rawurldecode($str);
preg_match_all(\"/%u.{4}|&#x.{4};|&#\\d+;|.+/U\",$str,$r);<BR> $ar = $r[0];<BR> foreach($ar as $k=>$v) {<BR> if(substr($v,0,2) == \"%u\")<BR> $ar[$k] = iconv(\"UCS-2\",\"GBK\",pack(\"H4\",substr($v,-4)));<BR> elseif(substr($v,0,3) == \"&#x\")<BR> $ar[$k] = iconv(\"UCS-2\",\"GBK\",pack(\"H4\",substr($v,3,-1)));<BR> elseif(substr($v,0,2) == \"&#\") {<BR> $ar[$k] = iconv(\"UCS-2\",\"GBK\",pack(\"n\",substr($v,2,-1)));<BR> }<BR> }<BR> return join(\"\",$ar);<BR>}<BR></div><BR><STRONG><FONT style=\"COLOR: #ff0000\">一、编码范围<BR></FONT>1. GBK (GB2312/GB18030)<BR></STRONG>\\x00-\\xff GBK双字节编码范围<BR>\\x20-\\x7f ASCII<BR>\\xa1-\\xff 中文<BR>\\x80-\\xff 中文<BR><STRONG>2. UTF-8 (Unicode)<BR></STRONG>\\u4e00-\\u9fa5 (中文)<BR>\\x3130-\\x318F (韩文<BR>\\xAC00-\\xD7A3 (韩文)<BR>\\u0800-\\u4e00 (日文)<BR>ps: 韩文是大于[\\u9fa5]的字符<BR><STRONG>正则例子:<BR></STRONG>preg_replace(\"/([\\x80-\\xff])/\",\"\",$str);<BR>preg_replace(\"/([u4e00-u9fa5])/\",\"\",$str);<BR>
</div>
</section>
<script type=\"text/javascript\">
(function() {
var s = \"_\" + Math.random().toString(36).slice(2);
document.write(\'<div style=\"\" id=\"\' + s + \'\"></div>\');
(window.slotbydup = window.slotbydup || []).push({
id: \"u4263905\",
container: s
});
})();
</script>
<section class=\"xgwz\">
<b>【热门文章】</b>
<ul>
<li><a href=\"/b.php/85276.html\">JQuery CheckBox(复选框)操作方法汇总</a></li><li><a href=\"/b.php/85277.html\">linux系统怎么用SecureCRT上传和下载文件?</a></li><li><a href=\"/b.php/85278.html\">2016年Win10 RedStone将重大改版 微软小娜可以浮动</a></li><li><a href=\"/b.php/85279.html\">高危KB3045645!Win7/8.1别安装这个补丁</a></li><li><a href=\"/b.php/85280.html\">php中生成随机密码的自定义函数代码</a></li><li><a href=\"/b.php/85281.html\">解析mysql中如何获得数据库的大小</a></li><li><a href=\"/b.php/85282.html\">Windows7右下角网络图标(小电脑)不停转圈的解决方法</a></li><li><a href=\"/b.php/85283.html\">基于jQuery实现Ajax验证用户名是否存在实例</a></li><li><a href=\"/b.php/85284.html\">javascript实现动态侧边栏代码</a></li><li><a href=\"/b.php/85285.html\">新手快速学习JavaScript免费教程资源汇总</a></li><li><a href=\"/b.php/85286.html\">Win10怎么设置自动更换桌面背景?Win10幻灯片背景设置方法</a></li><li><a href=\"/b.php/85287.html\">Linux中的VMware虚拟机开机出现滴警告音怎么办?</a></li><li><a href=\"/b.php/85288.html\">C#网络编程基础之进程和线程详解</a></li><li><a href=\"/b.php/85289.html\">setTimeout内不支持jquery的选择器的解决方案</a></li><li><a href=\"/b.php/85290.html\">在Linux系统中使用SHA256来校验下载的文件的方法</a></li><li><a href=\"/b.php/85291.html\">详解C语言中的getgrgid()函数和getgrnam()函数</a></li><li><a href=\"/b.php/85292.html\">DOM节点删除函数removeChild()用法实例</a></li><li><a href=\"/b.php/85293.html\">Win7系统鼠标灵敏度怎么调整让其符合自己的要求</a></li><li><a href=\"/b.php/85294.html\">PHP+Mysql+jQuery中国地图区域数据统计实例讲解</a></li><li><a href=\"/b.php/85295.html\">Andriod开发中引入jar包的正确方式介绍</a></li><li><a href=\"/b.php/85296.html\">JavaScript中的类数组对象介绍</a></li><li><a href=\"/b.php/85297.html\">jQuery实现公告文字左右滚动的实例代码</a></li><li><a href=\"/b.php/85298.html\">Avalon中文长字符截取、关键字符隐藏、自定义过滤器</a></li><li><a href=\"/b.php/85299.html\">PHP5中Cookie与 Session使用详解</a></li></ul>
</section>
<section class=\"xgwz\">
<b>【热门文章】</b>
<ul>
<li><a href=\"/c.php/52255.html\">Mac OS X 下PHP无法显示错误信息</a></li><li><a href=\"/c.php/52256.html\">iOS10相机权限设置了之后用户点击不允许crash</a></li><li><a href=\"/c.php/52257.html\">Xml节点内容正则表达式替换</a></li><li><a href=\"/c.php/52258.html\">有没有山东烟台可以做网站的小伙伴,求一起做个东西。</a></li><li><a href=\"/c.php/52259.html\">多部分水纹波动效果的实现</a></li><li><a href=\"/c.php/52260.html\">如何解决阻止正在执行的js?</a></li><li><a href=\"/c.php/52261.html\">IOS手势监听只能监听到第一次。</a></li><li><a href=\"/c.php/52262.html\">HTML5页面生成器</a></li><li><a href=\"/c.php/52263.html\">Spring框架下面各个部分是怎么样一种关系,他们都有那些职责?</a></li><li><a href=\"/c.php/52264.html\">有使用过Java关键字strictfp的经验么?</a></li><li><a href=\"/c.php/52265.html\">第三方组件引用类库与项目引用类库不一致</a></li><li><a href=\"/c.php/52266.html\">IE10报如此错误如何解决?</a></li><li><a href=\"/c.php/52267.html\">android关于Intent的一个问题</a></li><li><a href=\"/c.php/52268.html\">android 获取 短信会话ID 失败</a></li><li><a href=\"/c.php/52269.html\">SMTP邮件发送问题</a></li><li><a href=\"/c.php/52270.html\">shell输出中不同颜色的含义?</a></li><li><a href=\"/c.php/52271.html\">有用过dropzonejs拖拽上传文件的吗?php如何拿到它的值。</a></li><li><a href=\"/c.php/52272.html\">DB中关联查询和分别单独查询的优先级?</a></li><li><a href=\"/c.php/52273.html\">POI读取word内容的疑问</a></li><li><a href=\"/c.php/52274.html\">个人博客站点如何上传文章(非WordPress)</a></li></ul>
</section>
<section class=\"cont pl\" id=\"comment\"><b></b>
<div id=\"SOHUCS\" sid=\"art_104965\"></div>
</section>
<div class=\"search\">
<form action=\"http://zhannei.baidu.com/cse/search\" method=\"get\" target=\"_blank\" class=\"bdcs-search-form\" id=\"bdcs-search-form\">
<input name=\"s\" value=\"12351952642737355179\" type=\"hidden\">
<input name=\"entry\" value=\"1\" type=\"hidden\">
<input name=\"ie\" value=\"gbk\" type=\"hidden\">
<input name=\"nsid\" value=\"1\" type=\"hidden\">
<input type=\"text\" placeholder=\"请输入您感兴趣的关键字\" value=\"\" id=\"search_txt1\" maxlength=\"18\" class=\"search_txt\" name=\"q\">
<input class=\"search_btn\" value=\"搜 索\" type=\"submit\">
</form>
</div>
<nav class=\"nav-foot\">
<ul>
<li><a href=\"/jiaotong/huoche/\">火车</a></li>
<li><a href=\"/jiaotong/gaotie/\">高铁</a></li>
<li><a href=\"/jiaotong/qiche/\">汽车</a></li>
<li><a href=\"/jiaotong/gongjiao/\">公交</a></li>
<li><a href=\"/jiaotong/zijia/\">自驾</a></li>
<li><a href=\"/jiaotong/licheng/\">里程</a></li>
<li> <a href=\"/jiaotong/jingdian/\">景点</a></li>
<li><a href=\"/jiaotong/gonglue/\">攻略</a></li>
<li><a href=\"/jiaotong/wen/\">问路</a></li>
<li><a href=\"/\">计算机</a></li>
</ul>
<ul>
<li><a href=\"/\">首页</a></li>
<li><a href=\"/jiaotong/huoche/\">火车</a></li>
<li><a href=\"/jiaotong/gaotie/\">高铁</a></li>
<li><a href=\"/jiaotong/qiche/\">汽车</a></li>
<li><a href=\"/jiaotong/gongjiao/\">公交</a></li>
</ul>
</nav>
<footer class=\"footer-min\">
<div class=\"app\">
<a href=\"javascript:void(0)\" class=\"pc\">电脑版</a> - <a href=\"/\">返回首页</a></div>
<div class=\"copyright\">Copyright ©2017 <a href=\"/\">交通频道</a> All Rights Reserved</div>
</footer>
<div class=\"clearfix\"></div>
<div class=\"asd\"><span id=\"asd-footer\" class=\"jbTestPos\"><script>gx(4);</script></span></div>
<script>
var path_url=\"/b.php/89749.html\";
</script>
<script type=\"text/javascript\" src=\"/img/jquery-1.10.2.min.js\"></script>
<script type=\"text/javascript\" src=\"/img/menuclick.js\"></script>
<br>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement(\"script\");
hm.src = \"https://hm.baidu.com/hm.js?4e18701aa680bab2e8eb968e32500cf0\";
var s = document.getElementsByTagName(\"script\")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
</div>
</body>
</html>