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 相关文章推荐
dedecms 制作模板中使用的全局标记图文教程
Mar 11 PHP
解析PHP生成静态html文件的三种方法
Jun 18 PHP
PHP连接sql server 2005环境配置及问题解决
Aug 08 PHP
PHP使用xmllint命令处理xml与html的方法
Dec 15 PHP
PHP用反撇号执行外部命令
Apr 14 PHP
PHP实现基于mysqli的Model基类完整实例
Apr 08 PHP
浅析Yii2 GridView实现下拉搜索教程
Apr 22 PHP
php通过pecl方式安装扩展的实例讲解
Feb 02 PHP
php实现支付宝当面付(扫码支付)功能
May 30 PHP
PHP配置ZendOpcache插件加速
Feb 14 PHP
针对PHP开发安全问题的相关总结
Mar 22 PHP
PHP页面静态化――纯静态与伪静态用法详解
Jun 05 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
Protoss热键控制
2020/03/14 星际争霸
VFP与其他应用程序的集成
2006/10/09 PHP
一些关于PHP的知识
2006/11/17 PHP
一周学会PHP(视频)Http下载
2006/12/12 PHP
Php 构造函数construct的前下划线是双的_
2009/12/08 PHP
smarty简单分页的实现方法
2014/10/27 PHP
PHP模拟asp.net的StringBuilder类实现方法
2015/08/08 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
jQuery焦点图切换简易插件制作过程全纪录
2014/08/27 Javascript
javascript字符串与数组转换汇总
2015/05/26 Javascript
基于JavaScript实现TAB标签效果
2016/01/12 Javascript
jQuery实现放大镜效果实例代码
2016/03/17 Javascript
浅谈javascript中new操作符的原理
2016/06/07 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
JS中数组重排序方法
2016/11/11 Javascript
Bootstrap基本样式学习笔记之表格(2)
2016/12/07 Javascript
Vuex的actions属性的具体使用
2019/04/14 Javascript
Angular请求防抖处理第一次请求失效问题
2019/05/17 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
Vuex的热更替如何实现
2020/06/05 Javascript
解决ant Design中Select设置initialValue时的大坑
2020/10/29 Javascript
Python and、or以及and-or语法总结
2015/04/14 Python
pandas 获取季度,月度,年度首尾日期的方法
2018/04/11 Python
将python依赖包打包成window下可执行文件bat方式
2019/12/26 Python
使用卷积神经网络(CNN)做人脸识别的示例代码
2020/03/27 Python
python3 通过 pybind11 使用Eigen加速代码的步骤详解
2020/12/07 Python
html5指南-6.如何创建离线web应用程序实现离线访问
2013/01/07 HTML / CSS
婚礼新郎父母答谢词
2014/01/16 职场文书
《跟踪台风的卫星》教学反思
2014/04/10 职场文书
捐款倡议书
2014/04/14 职场文书
2014年师德承诺书
2014/05/23 职场文书
药剂专业自荐书
2014/06/20 职场文书
2015最新学生自我评价范文
2015/03/03 职场文书
员工聘用合同范本
2015/09/21 职场文书
给原生html中添加水印遮罩层的实现示例
2021/04/02 Javascript
java设计模式--三种工厂模式详解
2021/07/21 Java/Android