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+JS无限级可伸缩菜单详解(简单易懂)
Jan 02 PHP
php自动跳转中英文页面
Jul 29 PHP
解析如何去掉CodeIgniter URL中的index.php
Jun 25 PHP
php使用curl发送json格式数据实例
Dec 17 PHP
PHP中使用FFMPEG获取视频缩略图和视频总时长实例
May 04 PHP
PHP中使用php5-ffmpeg撷取视频图片实例
Jan 07 PHP
PHP中对数组的一些常用的增、删、插操作函数总结
Nov 27 PHP
解决yii2左侧菜单子级无法高亮问题的方法
May 08 PHP
PHP中多线程的两个实现方法
Oct 14 PHP
php使用crypt()函数进行加密
Jun 08 PHP
详解laravel passport OAuth2.0的4种模式
Nov 04 PHP
php实例化对象的实例方法
Nov 17 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
虫族 ZERG 概述
2020/03/14 星际争霸
php学习 字符串课件
2008/06/15 PHP
php实现通用的从数据库表读取数据到数组的函数实例
2015/03/21 PHP
PHP实现用户异地登录提醒功能的方法【基于thinkPHP框架】
2018/03/15 PHP
window.js 主要包含了页面的一些操作
2009/12/23 Javascript
默认让页面的第一个控件选中的javascript代码
2009/12/26 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
jQuery中extend函数的实现原理详解
2015/02/03 Javascript
微信小程序 图片绝对定位(背景图片)
2017/04/05 Javascript
Angular2学习教程之TemplateRef和ViewContainerRef详解
2017/05/25 Javascript
Vue.js学习记录之在元素与template中使用v-if指令实例
2017/06/27 Javascript
深入理解JS的事件绑定、事件流模型
2018/05/13 Javascript
一文了解Vue中的nextTick
2019/05/06 Javascript
vue实现节点增删改功能
2019/09/26 Javascript
vue+Element中table表格实现可编辑(select下拉框)
2020/05/21 Javascript
JSON获取属性值方法代码实例
2020/06/30 Javascript
python随机生成指定长度密码的方法
2015/04/04 Python
python 爬取微信文章
2016/01/30 Python
深入解析Python中的__builtins__内建对象
2016/06/21 Python
windows下Virtualenvwrapper安装教程
2017/12/13 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
django orm 通过related_name反向查询的方法
2018/12/15 Python
python3爬虫学习之数据存储txt的案例详解
2019/04/24 Python
python实现控制台输出彩色字体
2020/04/05 Python
Python数组拼接np.concatenate实现过程
2020/04/18 Python
基于Python词云分析政府工作报告关键词
2020/06/02 Python
详解canvas绘图时遇到的跨域问题
2018/03/22 HTML / CSS
英国简约舒适女装品牌:Great Plains
2018/07/27 全球购物
彪马土耳其官网:PUMA土耳其
2019/07/14 全球购物
一道输出判断型Java面试题
2014/10/01 面试题
大四自我鉴定
2014/02/08 职场文书
安全生产年活动总结
2014/08/29 职场文书
个人更名证明
2015/06/23 职场文书
《牧场之国》教学反思
2016/02/22 职场文书
Nginx虚拟主机的配置步骤过程全解
2022/03/31 Servers
golang语言指针操作
2022/04/14 Golang