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 相关文章推荐
Cakephp 执行主要流程
Mar 24 PHP
提高PHP编程效率的53个要点(经验小结)
Sep 04 PHP
实用的简单PHP分页集合包括使用方法
Oct 21 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
Jun 23 PHP
高性能PHP框架Symfony2经典入门教程
Jul 08 PHP
PHP实现删除字符串中任何字符的函数
Aug 11 PHP
Zend Framework教程之Resource Autoloading用法实例
Mar 08 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
php 读取输出其他文件的实现方法
Jul 26 PHP
PHP长连接实现与使用方法详解
Feb 11 PHP
PHP+redis实现的悲观锁机制示例
Jun 12 PHP
php获取用户真实IP和防刷机制的实例代码
Nov 28 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
PHP+MYSQL的文章管理系统(一)
2006/10/09 PHP
php 获取本机外网/公网IP的代码
2010/05/09 PHP
解析用PHP实现var_export的详细介绍
2013/06/20 PHP
PHP读取文件内容的五种方式
2015/12/28 PHP
Linux安装配置php环境的方法
2016/01/14 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
js 匿名调用实现代码
2009/06/19 Javascript
jquery DIV撑大让滚动条滚到最底部代码
2013/06/06 Javascript
jqgrid 表格数据导出实例
2013/11/21 Javascript
详解AngularJS过滤器的使用
2016/03/11 Javascript
浅谈Web页面向后台提交数据的方式和选择
2016/09/23 Javascript
jquery.Callbacks的实现详解
2016/11/30 Javascript
微信小程序之拖拽排序(代码分享)
2017/01/21 Javascript
Vue2几种常见开局方式详解
2017/09/09 Javascript
vue中使用input[type=&quot;file&quot;]实现文件上传功能
2018/09/10 Javascript
原生JavaScript实现日历功能代码实例(无引用Jq)
2019/09/23 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
python执行get提交的方法
2015/04/29 Python
浅谈python多线程和队列管理shell程序
2015/08/04 Python
Python实现FTP上传文件或文件夹实例(递归)
2017/01/16 Python
对Python3.x版本print函数左右对齐详解
2018/12/22 Python
python安装requests库的实例代码
2019/06/25 Python
opencv中图像叠加/图像融合/按位操作的实现
2020/04/01 Python
专科毕业生学习生活的自我评价
2013/10/26 职场文书
小学庆六一活动方案
2014/02/28 职场文书
个人贷款承诺书
2014/03/28 职场文书
企业负责人任命书
2014/06/05 职场文书
学校火灾防控方案
2014/06/09 职场文书
土建施工员岗位职责
2014/07/16 职场文书
高等学院职业生涯规划书范文
2014/09/16 职场文书
党支部组织生活会整改方案
2014/09/30 职场文书
创业项目(超低成本创业项目)
2019/08/16 职场文书
导游词之苏州寒山寺
2019/12/05 职场文书
html5调用摄像头截图功能
2022/01/18 Javascript