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&amp;&amp;mysql)一
Oct 09 PHP
PHP 实用代码收集
Jan 22 PHP
PHP isset()与empty()的使用区别详解
Aug 29 PHP
PHP读取PDF内容配合Xpdf的使用
Nov 24 PHP
destoon调用discuz论坛中带图片帖子的实现方法
Aug 21 PHP
PHP编程中的__clone()方法使用详解
Nov 27 PHP
thinkPHP分组后模板无法加载问题解决方法
Jul 12 PHP
PHP实现的曲线统计图表示例
Nov 10 PHP
PHP实现的Redis多库选择功能单例类
Jul 27 PHP
PHP学习笔记之session
May 06 PHP
PHP程序守护进程化实现方法详解
Jul 16 PHP
Cookie跨域问题解决方案代码示例
Nov 24 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
twig模板获取全局变量的方法
2016/02/05 PHP
CI框架扩展系统核心类的方法分析
2016/05/23 PHP
php微信支付之公众号支付功能
2018/05/30 PHP
php根据地址获取百度地图经纬度的实例方法
2019/09/03 PHP
laravel model 两表联查示例
2019/10/24 PHP
javascript 流畅动画实现原理
2009/09/08 Javascript
javascritp添加url参数将参数加入到url中
2014/09/25 Javascript
JavaScript生成福利彩票双色球号码
2015/05/15 Javascript
jQuery插件制作之全局函数用法实例
2015/06/01 Javascript
Bootstrap 粘页脚效果
2016/03/28 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
jQuery EasyUI Pagination实现分页的常用方法
2016/05/21 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
Vue.js每天必学之表单控件绑定
2016/09/05 Javascript
解决前端跨域问题方案汇总
2016/11/20 Javascript
BootStrap 模态框实现刷新网页并关闭功能
2017/01/04 Javascript
Vue.js实现一个漂亮、灵活、可复用的提示组件示例
2017/03/17 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
解决Vue中 父子传值 数据丢失问题
2019/08/27 Javascript
layui 富文本赋值,取值,取纯文本值的实例
2019/09/18 Javascript
webpack打包html里面img后src为“[object Module]”问题
2019/12/22 Javascript
微信小程序获取公众号文章列表及显示文章的示例代码
2020/03/10 Javascript
JS实现简单移动端鼠标拖拽
2020/07/23 Javascript
python实现随机密码字典生成器示例
2014/04/09 Python
学习Python3 Dlib19.7进行人脸面部识别
2018/01/24 Python
Python基础教程之内置函数locals()和globals()用法分析
2018/03/16 Python
Python中交换两个元素的实现方法
2018/06/29 Python
python实现朴素贝叶斯算法
2018/11/19 Python
Python控制台输出时刷新当前行内容而不是输出新行的实现
2020/02/21 Python
keras做CNN的训练误差loss的下降操作
2020/06/22 Python
英国领先的游戏零售商:GAME
2019/09/24 全球购物
退休感言
2014/01/28 职场文书
会计电算化专业求职信
2014/06/10 职场文书
党员评议思想汇报
2014/10/08 职场文书
2016年基层党组织创先争优承诺书
2016/03/25 职场文书
Python 流媒体播放器的实现(基于VLC)
2021/04/28 Python