PHP實(shí)現(xiàn)Javascript中的escape及unescape函數(shù)代碼分享

字號(hào):


    這篇文章主要介紹了PHP實(shí)現(xiàn)Javascript中的escape及unescape函數(shù)代碼分享,本文給出兩個(gè)實(shí)現(xiàn)版本,需要的朋友可以參考下
    這個(gè)類相當(dāng)好用.作用么,PHP做JSON傳遞GBK字符,比如中文,日文,韓文神馬的Unicode最合適不過(guò)了..
    <?php
    classcoding
    {
    //模仿JAVASCRIPT的ESCAPE和UNESCAPE函數(shù)的功能
    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){// 多字節(jié)字符
    $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 上找到的另外一個(gè)類似腳本
    <?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);
    }
    ?>