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
Php获取金书网的书名的实现代码
Jun 11 PHP
PHP之短标签开启设置
Jun 17 PHP
php获取apk包信息的方法
Aug 15 PHP
用PHP生成excel文件到指定目录
Jun 22 PHP
yii使用activeFileField控件实现上传文件与图片的方法
Dec 28 PHP
PHP中spl_autoload_register()函数用法实例详解
Jul 18 PHP
CodeIgniter框架基本增删改查操作示例
Mar 23 PHP
PHPMAILER实现PHP发邮件功能
Apr 18 PHP
php curl优化下载微信头像的方法总结
Sep 07 PHP
Laravel如何创建服务器提供者实例代码
Apr 15 PHP
php常用字符串查找函数strstr()与strpos()实例分析
Jun 21 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
PHP4 与 MySQL 交互使用
2006/10/09 PHP
php chr() ord()中文截取乱码问题解决方法
2008/09/08 PHP
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
Thinkphp连表查询及数据导出方法示例
2016/10/15 PHP
IE8 中使用加速器(Activities)
2010/05/14 Javascript
表单的焦点顺序tabindex和对应enter键提交
2013/01/04 Javascript
深入浅出分析javaScript中this用法
2015/05/09 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
浅析AngularJS中的指令
2016/03/20 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
微信小程序 图片等比例缩放(图片自适应屏幕)
2016/11/16 Javascript
jQuery实现拖动剪裁图片作为头像
2016/12/28 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
浅谈React前后端同构防止重复渲染
2018/01/05 Javascript
使用vue-cli打包过程中的步骤以及问题的解决
2018/05/08 Javascript
微信小程序的开发范式BeautyWe.js入门详解
2019/07/10 Javascript
Python中read()、readline()和readlines()三者间的区别和用法
2017/07/30 Python
简单了解什么是神经网络
2017/12/23 Python
TensorFlow的权值更新方法
2018/06/14 Python
pandas 数据类型转换的实现
2020/12/29 Python
HTML5新标签兼容——&gt; 的两种方法
2018/09/12 HTML / CSS
HTML5适合的情人节礼物有纪念日期功能
2021/01/25 HTML / CSS
纽约通行卡:The New York Pass(免费游览纽约90多个景点)
2017/07/29 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
网络编程中设计并发服务器,使用多进程与多线程,请问有什么区别?
2016/03/27 面试题
厨房领班竞聘演讲稿
2014/04/23 职场文书
2014年计生标语
2014/06/23 职场文书
珍惜资源的建议书
2014/08/26 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
2015高三毕业寄语赠言
2015/02/27 职场文书
《角的度量》教学反思
2016/02/18 职场文书
php 解析非标准json、非规范json
2021/04/01 PHP
教你快速开启Apache SkyWalking的自监控
2021/04/25 Servers
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android
docker-compose部署Yapi的方法
2022/04/08 Servers