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


Posted in PHP onFebruary 10, 2015

这个类相当好用.作用么,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=>$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);
    }
 
?>
PHP 相关文章推荐
PHP+DBM的同学录程序(2)
Oct 09 PHP
收集的php编写大型网站问题集
Mar 06 PHP
PHP页面间传递参数实例代码
Jun 05 PHP
PHP header函数分析详解
Aug 06 PHP
file_get_contents获取不到网页内容的解决方法
Mar 07 PHP
探讨:array2xml和xml2array以及xml与array的互相转化
Jun 24 PHP
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
Jul 01 PHP
php Imagick获取图片RGB颜色值
Jul 28 PHP
自定义min版smarty模板引擎MinSmarty.class.php文件及用法
May 20 PHP
thinkPHP连接sqlite3数据库的实现方法(附Thinkphp代码生成器下载)
May 27 PHP
windows server 2008/2012安装php iis7 mysql环境搭建教程
Jun 30 PHP
php中get_magic_quotes_gpc()函数说明
Feb 06 PHP
PHP实现获取FLV文件的时间
Feb 10 #PHP
PHP中实现获取IP和地理位置类分享
Feb 10 #PHP
PHP实现的简单mock json脚本分享
Feb 10 #PHP
PHP实现的带超时功能get_headers函数
Feb 10 #PHP
Laravel框架中实现使用阿里云ACE缓存服务
Feb 10 #PHP
Laravel中扩展Memcached缓存驱动实现使用阿里云OCS缓存
Feb 10 #PHP
PHP框架Laravel的小技巧两则
Feb 10 #PHP
You might like
ThinkPHP使用UTFWry地址库进行IP定位实例
2014/04/01 PHP
Linux下编译redis和phpredis的方法
2016/04/07 PHP
PHP简单获取网站百度搜索和搜狗搜索收录量的方法
2016/08/23 PHP
PHP微信发送推送消息乱码的解决方法
2019/02/28 PHP
Javascript 实用小技巧
2010/04/07 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
一个不错的仿携程自定义数据下拉选择select
2014/09/01 Javascript
JavaScript字符串对象toLowerCase方法入门实例(用于把字母转换为小写)
2014/10/17 Javascript
jQuery中prevUntil()方法用法实例
2015/01/08 Javascript
JavaScript实现图片轮播的方法
2015/07/31 Javascript
基于Bootstrap里面的Button dropdown打造自定义select
2016/05/30 Javascript
JavaScript知识点总结(十六)之Javascript闭包(Closure)代码详解
2016/05/31 Javascript
高效Web开发的10个jQuery代码片段
2016/07/22 Javascript
Vue.js学习之过滤器详解
2017/01/22 Javascript
详解vue渲染从后台获取的json数据
2017/07/06 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
JS div匀速移动动画与变速移动动画代码实例
2019/03/26 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
[03:38]2014DOTA2西雅图国际邀请赛 VG战队巡礼
2014/07/07 DOTA
[01:07:21]NAVI vs VG Supermajor 败者组 BO3 第二场 6.5
2018/06/06 DOTA
python线程锁(thread)学习示例
2013/12/04 Python
在Python中使用poplib模块收取邮件的教程
2015/04/29 Python
python 生成图形验证码的方法示例
2018/11/11 Python
Django 中间键和上下文处理器的使用
2019/03/17 Python
对于Python深浅拷贝的理解
2019/07/29 Python
基于Python中的yield表达式介绍
2019/11/19 Python
Python实现我的世界小游戏源代码
2021/03/02 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
canvas因为图片资源不在同一域名下而导致的跨域污染画布的解决办法
2019/01/18 HTML / CSS
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
杭州SQL浙江浙大网新恩普软件有限公司
2013/07/27 面试题
应届生个人求职信模板
2013/11/26 职场文书
升职自荐书范文
2013/11/28 职场文书
庆七一宣传标语
2014/10/08 职场文书
Oracle 死锁的检测查询及处理
2021/09/25 Oracle