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 用checkbox一次性删除多条记录的方法
Feb 23 PHP
PHP gbk环境下json_dencode传送来的汉字
Nov 13 PHP
php实现事件监听与触发的方法
Nov 21 PHP
php获取、检查类名、函数名、方法名的函数方法
Jun 25 PHP
搭建基于Docker的PHP开发环境的详细教程
Jul 01 PHP
PHP访问数据库集群的方法小结
Mar 14 PHP
php无法连接mysql数据库的正确解决方法
Jul 01 PHP
php监测数据是否成功插入到Mysql数据库的方法
Nov 25 PHP
thinkPHP数据库增删改查操作方法实例详解
Dec 06 PHP
mac os快速切换多个PHP版本的方法
Mar 07 PHP
Laravel构建即时应用的一种实现方法详解
Aug 31 PHP
win7 wamp 64位 php环境开启curl服务遇到的问题及解决方法
Sep 16 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的面向对象编程
2006/10/09 PHP
PHP计划任务、定时执行任务的实现代码
2011/04/23 PHP
PHP与javascript实现变量交互的示例代码
2013/07/23 PHP
thinkPHP3.2简单实现文件上传的方法
2016/05/16 PHP
php使用pecl方式安装扩展操作示例
2019/08/12 PHP
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
深入理解逻辑表达式的用法 与或非的用法
2016/06/06 Javascript
在localStorage中存储对象数组并读取的方法
2016/09/24 Javascript
javascript实现数据双向绑定的三种方式小结
2017/03/09 Javascript
VueJS如何引入css或者less文件的一些坑
2017/04/25 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
ES6/JavaScript使用技巧分享
2017/12/14 Javascript
javascript中call()、apply()的区别
2019/03/21 Javascript
通过实例学习React中事件节流防抖
2019/06/17 Javascript
vue 使用外部JS与调用原生API操作示例
2019/12/02 Javascript
vue实现移动端图片上传功能
2019/12/23 Javascript
小程序使用分包的示例代码
2020/03/23 Javascript
[02:12]DOTA2英雄基础教程 变体精灵
2013/12/16 DOTA
[01:22]DOTA2神秘商店携大量周边降临完美大师赛
2017/11/07 DOTA
Python模块学习 filecmp 文件比较
2012/08/27 Python
python pandas中DataFrame类型数据操作函数的方法
2018/04/08 Python
Python使用gRPC传输协议教程
2018/10/16 Python
python 提取key 为中文的json 串方法
2018/12/31 Python
pyqt5 使用cv2 显示图片,摄像头的实例
2019/06/27 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
Pandas实现DataFrame按行求百分数(比例数)
2019/12/27 Python
打架检讨书800字
2014/01/10 职场文书
闭幕式主持词
2014/04/02 职场文书
项目合作协议书范本
2014/04/16 职场文书
《天游峰的扫路人》教学反思
2014/04/25 职场文书
另类冲刺标语
2014/06/24 职场文书
2014年全国爱牙日宣传活动方案
2014/09/21 职场文书
教师求职简历自我评价
2015/03/10 职场文书
七年级英语教学反思
2016/02/15 职场文书
在Python 中将类对象序列化为JSON
2022/04/06 Python
Oracle查看表空间使用率以及爆满解决方案详解
2022/07/23 Oracle