zoukankan      html  css  js  c++  java
  • 在网上看到的一篇文章关于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;
    }



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

  • 相关阅读:
    分布式
    pytest+allure+jenkins
    Pytest-参数化和unittest-ddt的对比(两种数据驱动的对比)
    pytest- fixture个人理解总结
    os路径拼接时,比如os.path.join(base_dir,"Outputslogs")后半段斜杠请小心被识别为转义字符,所以请用/,因为windows都能识别到此路径。
    python中如何获取当前时间,并计算时间差
    Web UI自动化测试-滚动条操作
    java 基础 1.什么是Java?2.Java语言的特点?
    java 排序3 插入排序
    java 排序2 冒泡排序
  • 原文地址:https://www.cnblogs.com/phpshen/p/3577338.html
Copyright © 2011-2022 走看看