PHP实现Javascript中的escape及unescape函数代码分享

前端技术 2023/09/05 PHP

这个类相当好用.作用么,PHP做JSON传递GBK字符,比如中文,日文,韩文神马的Unicode最合适不过了..

<?php
classcoding
{
  //模仿JAVASCRIPT的ESCAPE和UNESCAPE函数的功能 
  functionunescape($str)
  {
    $text=preg_replace_callback(\"/%u[0-9A-Za-z]{4}/\",array(
      &$this,
      \'toUtf8\'
    ),$str);
    returnmb_convert_encoding($text,\"gb2312\",\"utf-8\");
  }
  
  functiontoUtf8($ar)
  {
    foreach($aras$val){
      $val=intval(substr($val,2),16);
      if($val<0x7F){// 0000-007F 
        $c.=chr($val);
      }elseif($val<0x800){// 0080-0800 
        $c.=chr(0xC0|($val/64));
        $c.=chr(0x80|($val%64));
      }else{// 0800-FFFF 
        $c.=chr(0xE0|(($val/64)/64));
        $c.=chr(0x80|(($val/64)%64));
        $c.=chr(0x80|($val%64));
      }
    }
    return$c;
  }
  
  functionescape($string,$encoding=\'gb2312\')
  {
    $return=\'\';
    for($x=0;$x<mb_strlen($string,$encoding);$x++){
      $str=mb_substr($string,$x,1,$encoding);
      if(strlen($str)>1){// 多字节字符 
        $return.=\'%u\'.strtoupper(bin2hex(mb_convert_encoding($str,\'UCS-2\',$encoding)));
      }else{
        $return.=\'%\'.strtoupper(bin2hex($str));
      }
    }
    return$return;
  }
  
  functiongb2utf8($string,$encoding=\'utf-8\',$from_encode=\'gb2312\')
  {
    returnmb_convert_encoding($string,$encoding,$from_encode);
  }
  
}
?>

google code 上找到的另外一个类似脚本

<?php
 
    functionphpescape($str)
    {
        $sublen=strlen($str);
        $retrunString=\"\";
        for($i=0;$i<$sublen;$i++)
        {
            if(ord($str[$i])>=127)
            {
                $tmpString=bin2hex(iconv(\"gbk\",\"ucs-2\",substr($str,$i,2)));
                $tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
                $retrunString.=\"%u\".$tmpString;
                $i++;
            }else{
                $retrunString.=\"%\".dechex(ord($str[$i]));
            }
        }
        return$retrunString;
    }
 
 
    functionescape($str)
    {
        preg_match_all(\"/[\\x80-\\xff].|[\\x01-\\x7f]+/\",$str,$r);
        $ar=$r[0];
        foreach($aras$k=>$v)
        {
            if(ord($v[0])<128)
                $ar[$k]=rawurlencode($v);
            else
                $ar[$k]=\"%u\".bin2hex(iconv(\"UTF-8\",\"UCS-2\",$v));
        }
        returnjoin(\"\",$ar);
    }
 
    functionphpunescape($source)
    {
        $decodedStr=\"\";
        $pos=0;
        $len=strlen($source);
        
        while($pos<$len)
        {
            $charAt=substr($source,$pos,1);
            if($charAt==\'%\')
            {
                $pos++;
                $charAt=substr($source,$pos,1);
                if($charAt==\'u\')
                {
                    // we got a unicode character 
                    $pos++;
                    $unicodeHexVal=substr($source,$pos,4);
                    $unicode=hexdec($unicodeHexVal);
                    $entity=\"&#\".$unicode.\';\';
                    $decodedStr.=utf8_encode($entity);
                    $pos+=4;
                }else{
                    // we have an escaped ascii character 
                    $hexVal=substr($source,$pos,2);
                    $decodedStr.=chr(hexdec($hexVal));
                    $pos+=2;
                }
            }else{
                $decodedStr.=$charAt;
                $pos++;
            }
        }
        return$decodedStr;
    }
    
    
    functionunescape($str)
    {
        $str=rawurldecode($str);
        preg_match_all(\"/(?:%u.{4})|&#x.{4};|&#\\d+;|.+/U\",$str,$r);
        $ar=$r[0];
        #print_r($ar);
        foreach($aras$k=&gt;$v)
        {
            if(substr($v,0,2)==\"%u\")
                $ar[$k]=iconv(\"UCS-2\",\"UTF-8\",pack(\"H4\",substr($v,-4)));
            elseif(substr($v,0,3)==\"&#x\")
                $ar[$k]=iconv(\"UCS-2\",\"UTF-8\",pack(\"H4\",substr($v,3,-1)));
            elseif(substr($v,0,2)==\"&#\")
            {
                //echo substr($v,2,-1).\"\";
                $ar[$k]=iconv(\"UCS-2\",\"UTF-8\",pack(\"n\",substr($v,2,-1)));
            }
        }
        returnjoin(\"\",$ar);
    }
 
&#63;&gt;
</pre>
</div>
<p></p>

</div>
</section>
<section class=\"xgwz\">
<b>【热门文章】</b>
<ul>

 <li><a href=\"/b.php/96337.html\">Win8系统打开代理软件时出现蓝屏问题的解决方法介绍</a></li><li><a href=\"/b.php/96338.html\">javascript相关事件的几个概念</a></li><li><a href=\"/b.php/96339.html\">php警告Creating default object from empty value 问题的解决方法</a></li><li><a href=\"/b.php/96340.html\">在ASP.NET 2.0中操作数据之四十七:用SqlDataSource控件插入、更新、删除数据</a></li><li><a href=\"/b.php/96341.html\">实例讲解jquery中mouseleave和mouseout的区别</a></li><li><a href=\"/b.php/96342.html\">Ubuntu系统下Xen虚拟机的基本安装方法</a></li><li><a href=\"/b.php/96343.html\">min-width最小宽度的作用介绍</a></li><li><a href=\"/b.php/96344.html\">在CentOS系统上安装网络监控软件ntopng</a></li><li><a href=\"/b.php/96345.html\">Bootstrap4一次重大更新 几乎涉及每行代码</a></li><li><a href=\"/b.php/96346.html\">MongoDB中创建索引需要注意的事项</a></li><li><a href=\"/b.php/96347.html\">浅谈ADO.NET数据库脚本</a></li><li><a href=\"/b.php/96348.html\">两款JS脚本判断手机浏览器类型跳转WAP手机网站</a></li><li><a href=\"/b.php/96349.html\">使用JS画图之点、线、面</a></li><li><a href=\"/b.php/96350.html\">php上传文件并显示上传进度的方法</a></li><li><a href=\"/b.php/96351.html\">MYSQL中常用的强制性操作(例如强制索引)</a></li><li><a href=\"/b.php/96352.html\">css 文本两端对齐应用实例</a></li><li><a href=\"/b.php/96353.html\">Android实现仿网易新闻主界面设计</a></li><li><a href=\"/b.php/96354.html\">js使用split函数按照多个字符对字符串进行分割的方法</a></li><li><a href=\"/b.php/96355.html\">基于jquery插件实现拖拽删除图片功能</a></li><li><a href=\"/b.php/96356.html\">一个完整的php文件上传类实例讲解</a></li><li><a href=\"/b.php/96357.html\">Win8禁止在导航窗格中显示图片文件夹的方法</a></li><li><a href=\"/b.php/96358.html\">linux系统常用命令有哪些? semicolon命令的使用方法</a></li><li><a href=\"/b.php/96359.html\">jquery siblings获取同辈元素用法实例分析</a></li><li><a href=\"/b.php/96360.html\">JS实现复制内容到剪贴板功能兼容所有浏览器(推荐)</a></li></ul>
</section>


  <section class=\"xgwz\">
  <b>【热门文章】</b>
  <ul>
 <li><a href=\"/c.php/32777.html\">七牛如何获取token</a></li><li><a href=\"/c.php/32778.html\">android 变量同时存取的效率问题</a></li><li><a href=\"/c.php/32779.html\">在Mac上使用Charles抓取所有网络流量包</a></li><li><a href=\"/c.php/32780.html\">求一句UPDATE语句</a></li><li><a href=\"/c.php/32781.html\">如何实现wifi认证页面自动提交?</a></li><li><a href=\"/c.php/32782.html\">能否有好方法给一个无序列表各项每一个绑定一个对象或者数组形式的值?</a></li><li><a href=\"/c.php/32783.html\">Ubuntu下使用eclipse ADT开发android ,为什么无法在图形开发界面和代码界面切换?</a></li><li><a href=\"/c.php/32784.html\">请推荐一个轻巧的python运行环境</a></li><li><a href=\"/c.php/32785.html\">如何测试网页在ipad上的显示效果?</a></li><li><a href=\"/c.php/32786.html\">关于socket通信的疑问?</a></li><li><a href=\"/c.php/32787.html\">使用eslint怎么限制函数里的代码行数</a></li><li><a href=\"/c.php/32788.html\">IE8的伪元素有不能及时重绘的bug,我另外发现了一个IE8的伪元素固定定位fixed的bug</a></li><li><a href=\"/c.php/32789.html\">git如何清除工作区所有还没有add的文件的修改?</a></li><li><a href=\"/c.php/32790.html\">Android开发surfaceview绘制图形无法显示</a></li><li><a href=\"/c.php/32791.html\">php的foreach循环6万多次应该如何使用多线程</a></li><li><a href=\"/c.php/32792.html\">请教nginx是怎么处理静态文件的?</a></li><li><a href=\"/c.php/32793.html\">有没有类似基于Boostrap的daterangepicker的时间范围jQuery插件</a></li><li><a href=\"/c.php/32794.html\">Mac上的home目录在哪里呢?</a></li><li><a href=\"/c.php/32795.html\">Java 中将对象引用置 null 的作用?</a></li><li><a href=\"/c.php/32796.html\">关于viewpager嵌套listview和viewpager</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 &copy;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/97736.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>

本文地址:https://www.stayed.cn/item/13742

转载请注明出处。

本站部分内容来源于网络,如侵犯到您的权益,请 联系我

我的博客

人生若只如初见,何事秋风悲画扇。