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程序中的常见漏洞进行攻击
Oct 09 PHP
让你同时上传 1000 个文件 (二)
Oct 09 PHP
php内核解析:PHP中的哈希表
Jan 30 PHP
PHP加Nginx实现动态裁剪图片方案
Mar 10 PHP
win7计划任务定时执行PHP脚本设置图解
May 09 PHP
PHP生成图片验证码、点击切换实例
Jun 25 PHP
PHP调试函数和日志记录函数分享
Jan 31 PHP
php中ob函数缓冲机制深入理解
Aug 03 PHP
php中__toString()方法用法示例
Dec 07 PHP
AJAX的使用方法详解
Apr 29 PHP
php弹出提示框的是实例写法
Sep 26 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
Sep 30 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新手上路(五)
2006/10/09 PHP
php 启动时报错的简单解决方法
2014/01/27 PHP
php截取字符串之截取utf8或gbk编码的中英文字符串示例
2014/03/12 PHP
PHP插件PHPMailer发送邮件功能
2017/02/28 PHP
laravel5.4生成验证码的实例讲解
2017/08/05 PHP
PHP简单实现模拟登陆功能示例
2017/09/15 PHP
php微信分享到朋友圈、QQ、朋友、微博
2019/02/18 PHP
PHP实现文件上传后台处理脚本
2020/03/04 PHP
jquery的extend和fn.extend的使用说明
2011/01/09 Javascript
js鼠标滑过弹出层的定位IE6bug解决办法
2012/12/26 Javascript
JavaScript二维数组实现的省市联动菜单
2014/05/08 Javascript
简述jQuery ajax的执行顺序
2016/01/05 Javascript
JavaScript函数内部属性和函数方法实例详解
2016/03/17 Javascript
AngularJS基础 ng-href 指令用法
2016/08/01 Javascript
vue基于viewer实现的图片查看器功能
2019/04/12 Javascript
koa2+vue实现登陆及登录状态判断
2019/08/15 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
Python中使用MELIAE分析程序内存占用实例
2015/02/18 Python
使用Python脚本将绝对url替换为相对url的教程
2015/04/24 Python
Python selenium文件上传方法汇总
2020/11/19 Python
Python 专题五 列表基础知识(二维list排序、获取下标和处理txt文本实例)
2017/03/20 Python
Python学习入门之区块链详解
2017/07/25 Python
Python实现的归并排序算法示例
2017/11/21 Python
python3爬取淘宝信息代码分析
2018/02/10 Python
基于循环神经网络(RNN)的古诗生成器
2018/03/26 Python
python特性语法之遍历、公共方法、引用
2018/08/08 Python
python list格式数据excel导出方法
2018/10/31 Python
Python3和PyCharm安装与环境配置【图文教程】
2020/02/14 Python
python GUI库图形界面开发之PyQt5单选按钮控件QRadioButton详细使用方法与实例
2020/02/28 Python
使用PyQt5实现图片查看器的示例代码
2020/04/21 Python
HTML5 Canvas中绘制椭圆的4种方法
2015/04/24 HTML / CSS
英国家居用品和家居装饰品购物网站:Cox & Cox
2019/08/25 全球购物
普通大学毕业生自荐信范文
2014/02/23 职场文书
食堂采购员岗位职责
2015/04/03 职场文书
php远程请求CURL案例(爬虫、保存登录状态)
2021/04/01 PHP
从结婚开始的恋爱故事。小说《我的美好婚事》TV动画化决定
2022/04/07 日漫