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安装攻略:常见问题解答(二)
Oct 09 PHP
php抓取页面与代码解析 推荐
Jul 23 PHP
php URL验证正则表达式
Jul 19 PHP
php UBB 解析实现代码
Nov 27 PHP
PHP获取毫秒级时间戳的方法
Apr 15 PHP
PHP加密解密字符串汇总
Apr 26 PHP
PHP使用redis实现统计缓存mysql压力的方法
Nov 14 PHP
总结PHP中DateTime的常用方法
Aug 11 PHP
详解php几行代码实现CSV格式文件输出
Jul 01 PHP
PHP中TP5 上传文件的实例详解
Jul 31 PHP
php表单处理操作
Nov 16 PHP
php微信公众号开发之二级菜单
Oct 20 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
DW中链接mysql数据库时,建立字符集中文出现乱码的解决方法
2010/03/27 PHP
基于php-fpm的配置详解
2013/06/03 PHP
PHP+Mysql基于事务处理实现转账功能的方法
2015/07/08 PHP
ThinkPHP在Cli模式下使用模板引擎的方法
2015/09/25 PHP
PHP命名空间namespace的定义方法详解
2017/03/29 PHP
Prototype1.5 rc2版指南最后一篇之Position
2007/01/10 Javascript
Use Word to Search for Files
2007/06/15 Javascript
Firefox getBoxObjectFor getBoundingClientRect联系
2008/10/26 Javascript
js 匿名调用实现代码
2009/06/19 Javascript
Jquery ajax传递复杂参数给WebService的实现代码
2011/08/08 Javascript
js模拟C#中List的简单实例
2014/03/06 Javascript
javascript内置对象操作详解
2015/02/04 Javascript
jQuery解决input超多的表单提交
2015/08/10 Javascript
基于jQuery倾斜打开侧边栏菜单特效代码
2015/09/15 Javascript
Bootstrap精简教程
2015/11/27 Javascript
Vuejs第六篇之Vuejs与form元素实例解析
2016/09/05 Javascript
微信小程序 配置文件详细介绍
2016/12/14 Javascript
vue单个组件实现无限层级多选菜单功能
2018/04/10 Javascript
vue使用v-for实现hover点击效果
2018/09/29 Javascript
小程序实现列表点赞功能
2018/11/02 Javascript
JS与SQL方式随机生成高强度密码示例
2018/12/29 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
python学习手册中的python多态示例代码
2014/01/21 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
python 格式化输出百分号的方法
2019/01/20 Python
Python产生一个数值范围内的不重复的随机数的实现方法
2019/08/21 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
2019/09/26 Python
详解Python list和numpy array的存储和读取方法
2019/11/06 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
I.T集团香港官方商城:ITeSHOP.com Hong Kong
2019/02/15 全球购物
Timberland德国官网:靴子、鞋子、衣服、夹克及配件
2019/12/10 全球购物
为什么要用EJB
2014/04/17 面试题
关于环保的建议书
2014/05/12 职场文书
农村结婚典礼主持词
2015/06/29 职场文书
2019关于实习生工作安排及待遇的管理方案!
2019/07/16 职场文书
关于vue-router-link选择样式设置
2022/04/30 Vue.js