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 相关文章推荐
详解:――如何将图片储存在数据库里
Dec 05 PHP
PHP4中session登录页面的应用
Jul 25 PHP
ubuntu10.04配置 nginx+php-fpm模式的详解
Jun 03 PHP
php多用户读写文件冲突的解决办法
Nov 06 PHP
thinkphp3.2.2实现生成多张缩略图的方法
Dec 19 PHP
php获取用户浏览器版本的方法
Jan 03 PHP
PHP模拟asp.net的StringBuilder类实现方法
Aug 08 PHP
PHP获取指定时间段之间的 年,月,天,时,分,秒
Jun 05 PHP
php实现常见图片格式的水印和缩略图制作(面向对象)
Jun 15 PHP
PHP+JQUERY操作JSON实例
Mar 23 PHP
PHP实现动态获取函数参数的方法示例
Apr 02 PHP
PHP操作Redis数据库常用方法示例
Aug 25 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
简单介绍下 PHP5 中引入的 MYSQLI的用途
2007/03/19 PHP
php定义数组和使用示例(php数组的定义方法)
2014/03/29 PHP
PHP实现提高SESSION响应速度的几种方法详解
2019/08/09 PHP
laravel-admin自动生成模块,及相关基础配置方法
2019/10/08 PHP
jquery ajax 同步异步的执行 return值不能取得的解决方案
2012/01/08 Javascript
用JavaScript获取DOM元素位置和尺寸大小的方法
2013/04/12 Javascript
用js实现输入提示(自动完成)的实例代码
2013/06/14 Javascript
JS实现文件动态顺序载入的方法
2015/03/07 Javascript
HTML+CSS+JS实现完美兼容各大浏览器的TABLE固定列
2015/04/26 Javascript
基于JavaScript实现简单的随机抽奖小程序
2016/01/05 Javascript
BootstrapTable与KnockoutJS相结合实现增删改查功能【二】
2016/05/10 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
简单的JS控制button颜色随点击更改的实现方法
2017/04/17 Javascript
webpack学习--webpack经典7分钟入门教程
2017/06/28 Javascript
JS实现点击下拉列表文本框中出现对应的网址,点击跳转按钮实现跳转
2019/11/25 Javascript
[14:19]2018年度COSER大赛-完美盛典
2018/12/16 DOTA
[00:59]DOTA2英雄背景故事——上古巨神
2020/06/28 DOTA
Windows 64位下python3安装nltk模块
2018/09/19 Python
Tornado实现多进程/多线程的HTTP服务详解
2019/07/25 Python
基于python实现FTP文件上传与下载操作(ftp&amp;sftp协议)
2020/04/01 Python
python 错误处理 assert详解
2020/04/20 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
详解pycharm自动import所需的库的操作方法
2020/11/30 Python
巴西最大的家电和百货零售商:Casas Bahia
2016/11/22 全球购物
Shopping happy life西班牙:以最优惠的价格提供最好的时尚配饰
2020/03/13 全球购物
New Balance比利时官方网站:购买鞋子和服装
2021/01/15 全球购物
异步传递消息系统的作用
2016/05/01 面试题
毕业自我鉴定范文
2013/11/06 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
市场营销毕业生自荐信范文
2014/04/01 职场文书
协议书模板
2014/04/23 职场文书
合伙经营协议书范本
2014/09/13 职场文书
院党委组织查摆问题对照检查材料思想汇报2014
2014/10/08 职场文书
2015年第十五个全民国防教育日宣传活动方案
2015/05/06 职场文书
2015年秋学期师德师风建设工作总结
2015/10/23 职场文书
MySQL如何修改字段类型和字段长度
2022/06/10 MySQL