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 相关文章推荐
WIN98下Apache1.3.14+PHP4.0.4的安装
Oct 09 PHP
php miniBB中文乱码问题解决方法
Nov 25 PHP
PHP 可阅读随机字符串代码
May 26 PHP
PHP Array交叉表实现代码
Aug 05 PHP
php去除换行(回车换行)的三种方法
Mar 26 PHP
PHP、Nginx、Apache中禁止网页被iframe引用的方法
Oct 01 PHP
windows下配置php5.5开发环境及开发扩展
Dec 25 PHP
帝国cms常用标签汇总
Jul 06 PHP
PHP中把对象数组转换成普通数组的方法
Jul 10 PHP
Yii视图CGridView列表用法实例分析
Jul 12 PHP
laravel实现图片上传预览,及编辑时可更换图片,并实时变化的例子
Nov 14 PHP
php的RSA加密解密算法原理与用法分析
Jan 23 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实现在线阅读PDF文件的方法
2015/06/17 PHP
培养自己的php编码规范
2015/09/28 PHP
PHP将字符串首字母大小写转换的实例
2017/01/21 PHP
phpMyAdmin通过密码漏洞留后门文件
2018/11/20 PHP
jQuery AJAX回调函数this指向问题
2010/02/08 Javascript
跨浏览器的事件对象介绍
2012/06/27 Javascript
jQuery判断checkbox是否选中的小例子
2013/12/02 Javascript
jquery中的on方法使用介绍
2013/12/29 Javascript
javascript 闭包详解
2015/07/02 Javascript
使用HTML5+Boostrap打造简单的音乐播放器
2016/08/05 Javascript
Javascript oop设计模式 面向对象编程简单实例介绍
2016/12/13 Javascript
nodejs进阶(6)—连接MySQL数据库示例
2017/01/07 NodeJs
一步一步的了解webpack4的splitChunk插件(小结)
2018/09/17 Javascript
JavaScript实现横版菜单栏
2020/03/17 Javascript
JS定时器如何实现提交成功提示功能
2020/06/12 Javascript
[02:45]DOTA2英雄基础教程 伐木机
2013/12/23 DOTA
[32:26]EG vs IG 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
Python算法之求n个节点不同二叉树个数
2017/10/27 Python
Python网页正文转换语音文件的操作方法
2018/12/09 Python
Python生成器常见问题及解决方案
2020/03/21 Python
使用pymysql查询数据库,把结果保存为列表并获取指定元素下标实例
2020/05/15 Python
Python 开发工具通过 agent 代理使用的方法
2020/09/27 Python
使用HTML5的Notification API制作web通知的教程
2015/05/08 HTML / CSS
ALDI奥乐齐官方海外旗舰店:德国百年超市
2017/12/27 全球购物
英国优质家居用品网上品牌:URBANARA
2018/06/01 全球购物
Hotels.com英国:全球领先的酒店住宿提供商
2019/01/24 全球购物
如何使用PHP session
2015/04/21 面试题
保护环境演讲稿
2014/05/10 职场文书
森林防火标语
2014/06/23 职场文书
企业挂职心得体会
2014/09/10 职场文书
2014年售后服务工作总结
2014/11/18 职场文书
2015年机关作风和效能建设工作总结
2015/07/23 职场文书
教师实习自我鉴定总结
2019/08/20 职场文书
php引用传递
2021/04/01 PHP