• 在网上看到的一篇文章关于js和php编码的



    解决办法: 采用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;
    }



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

  • 相关阅读:
    常用正则搜集(已验证)
    oracle 如何跨用户查询数据
    SVN状态图标消失的解决方法
    oracle 简单列操作
    正则替换行尾,行末内容
    怎么解决svn清理失败且路径显示乱码问题
    Oracle坑爹入门踩坑篇
    如何过滤datable?
    JS产生模态窗口,关闭后刷新父窗体。(兼容各浏览器)
    6 Jmeter脚本组成和组件搭配
  • 原文地址:https://www.cnblogs.com/phpshen/p/3577338.html
Copyright © 2020-2023  润新知