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面向对象概念
Nov 06 PHP
PHP中创建空文件的代码[file_put_contents vs touch]
Jan 20 PHP
dhtmlxTree目录树增加右键菜单以及拖拽排序的实现方法
Apr 26 PHP
ci检测是ajax还是页面post提交数据的方法
Nov 10 PHP
PHP框架Laravel学习心得体会
Oct 28 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
CodeIgniter记录错误日志的方法全面总结
May 17 PHP
Docker 如何布置PHP开发环境
Jun 21 PHP
php获取客户端IP及URL的方法示例
Feb 03 PHP
php使用Jpgraph创建折线图效果示例
Feb 15 PHP
分析php://output和php://stdout的区别
May 06 PHP
php中的依赖注入实例详解
Aug 14 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分页代码详解
2008/03/27 PHP
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
php数字游戏 计算24算法
2012/06/10 PHP
php中如何判断一个网页请求是ajax请求还是普通请求
2013/08/10 PHP
深入理解php printf() 输出格式化的字符串
2016/05/23 PHP
详谈PHP程序Laravel 5框架的优化技巧
2016/07/18 PHP
28个JS验证函数收集
2010/03/02 Javascript
YUI模块开发原理详解
2013/11/18 Javascript
利用jquery.qrcode在页面上生成二维码且支持中文
2014/02/12 Javascript
移动端 一个简单易懂的弹出框
2016/07/06 Javascript
DOM操作原生js 的bug,使用jQuery 可以消除的解决方法
2016/09/04 Javascript
浅谈Node.js:fs文件系统模块
2016/12/08 Javascript
JQuery页面随滚动条动态加载效果的简单实现(推荐)
2017/02/08 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
AngularJS实现select的ng-options功能示例
2017/07/12 Javascript
移动端Ionic App 资讯上下循环滚动的实现代码(跑马灯效果)
2017/08/29 Javascript
jQuery第一次运行页面默认触发点击事件的实例
2018/01/10 jQuery
NodeJS加密解密及node-rsa加密解密用法详解
2018/10/12 NodeJs
vue实现的请求服务器端API接口示例
2019/05/25 Javascript
WEEX环境搭建与入门详解
2019/10/16 Javascript
vue 数据操作相关总结
2020/12/17 Vue.js
python获取从命令行输入数字的方法
2015/04/29 Python
Python迭代和迭代器详解
2016/11/10 Python
windows下安装Python的XlsxWriter模块方法
2018/05/03 Python
Python二叉树定义与遍历方法实例分析
2018/05/25 Python
pandas条件组合筛选和按范围筛选的示例代码
2019/08/26 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
Python基于traceback模块获取异常信息
2020/07/23 Python
python 实现全球IP归属地查询工具
2020/12/18 Python
Python环境搭建过程从安装到Hello World
2021/02/05 Python
阿联酋电子产品购物网站:Menakart
2017/09/15 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
python实现语音常用度量方法的代码详解
2021/05/25 Python
python字典的元素访问实例详解
2021/07/21 Python
MySQL into_Mysql中replace与replace into用法案例详解
2021/09/14 MySQL
如何在Python中妥善使用进度条详解
2022/04/05 Python