亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

解析php中的escape函數(shù)

 更新時(shí)間:2013年06月29日 09:42:36   作者:  
本篇文章是對(duì)php中的escape函數(shù)進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
采用js對(duì)URL中的漢字進(jìn)行escape編碼。
<a href="" onclick="window.open('product_list.php?p_sort='+escape('腳本之家'));">這樣點(diǎn)擊鏈接后的效時(shí):
引用:http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51
生成了這樣的效果, 很明顯用PHP的urldecode()或者base64_decode()是無(wú)法反解的。
解決方法, 用PHP寫(xiě)一個(gè)反解函數(shù):
復(fù)制代碼 代碼如下:

function js_unescape($str){       
$ret = '';       
$len = strlen($str);       
for ($i = 0; $i < $len; $i++)       
{               
if ($str[$i] == '%' && $str[$i+1] == 'u')               
{                       
$val = hexdec(substr($str, $i+2, 4));                       
if ($val < 0x7f) $ret .= chr($val);                       
else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));                        else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));                       
$i += 5;               
}               
else if ($str[$i] == '%')               
{                       
$ret .= urldecode(substr($str, $i, 3));                       
$i += 2;               
}               
else $ret .= $str[$i];       
}       
return $ret;}

注意JS編碼會(huì)自動(dòng)轉(zhuǎn)換成為UTF-8, 所以必須進(jìn)行編碼轉(zhuǎn)換才能得到正確的結(jié)果,否則會(huì)中文亂碼。但如果使用UTF-8編碼就不用這一步了。
代碼如下:print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
到此我們就成功地反解了js的escape編碼了。
如下:
另外我找到個(gè)用PHP實(shí)現(xiàn)js的escape編碼的函數(shù):
復(fù)制代碼 代碼如下:

function phpescape($str)
{        
$sublen=strlen($str);
      $retrunString="";        
for ($i=0;$i<$sublen;$i++)        
{                 
if(ord($str[$i])>=127)                 
{                          
$tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));                          
//$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打開(kāi)此項(xiàng)                          
$retrunString.="%u".$tmpString;                          
$i++;                 
} else
{                          
$retrunString.="%".dechex(ord($str[$i]));                 
}        
}        
return $retrunString;
}

在json中不支持中文,用它傳送中文數(shù)據(jù)就會(huì)出現(xiàn)數(shù)據(jù)丟失或者亂碼,必須在傳 送前對(duì)要發(fā)送的字符串進(jìn)行編碼,由于傳送過(guò)去需要用js進(jìn)行數(shù)據(jù)解析,考慮到j(luò)s中有unescape函數(shù),故若在php中有個(gè)escape函數(shù),對(duì)數(shù)據(jù) 進(jìn)行編碼,在客戶端用unescape進(jìn)行 解碼,這樣就會(huì)方便很多。
先在網(wǎng)上搜索一把,很多用php實(shí)現(xiàn)的escape函數(shù),大同小異,比如下面一個(gè):
復(fù)制代碼 代碼如下:

function phpEscape($str) {
preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);
$ar = $r[0];
foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)
      $ar[$k] = rawurlencode($v);
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));
}
return join("",$ar);
}

這個(gè)函數(shù)可以很好的工作,但是,也許有新手不理解這個(gè)函數(shù)的原理(比如我),用起來(lái)總是不放心,現(xiàn)在我就來(lái)解釋一下這個(gè)函數(shù)的原理。而且我認(rèn)為,拿別人的代碼來(lái)復(fù)用,好比站在了巨人的肩膀上,但是若不理解別人的代碼,遲早要掉到地面上。
第一句:preg_match_all("/[\x80-\xff].|[\x01-\x7f]+/",$str,$r);這個(gè)是用正則表達(dá)式匹配 字符串中所有的字符,[\x80-\xff]. 匹配的是漢字,\x表示匹配字符的16進(jìn)制編碼,[ ] 是類選擇符,“.” 表示任意一個(gè)字符,這樣[\x80-\xff].匹配的是兩個(gè)字符,其中第一個(gè)就是16進(jìn)制從80到ff的字符,而這恰好就是漢字編碼的第一個(gè)字符。這樣 就能完整的匹配一個(gè)漢字。關(guān)于unicode中漢字的編碼,大家可以到網(wǎng)上搜索一下。同理,[\x01-\x7f]+英文字符串,因?yàn)樽钤绲挠⑽氖?ASCII編碼,編碼值小于128,也就是16進(jìn)制的從01到7f,"+"表示一個(gè)或者多個(gè)字符,這樣[\x01-\x7f]+就能匹配連續(xù)多個(gè)英文字符 串。
復(fù)制代碼 代碼如下:

$ar = $r[0];             //$r[0]里存放是匹配到的數(shù)組
foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)                 //假如字符編碼值小于128,說(shuō)明是個(gè)英文字符
      $ar[$k] = rawurlencode($v);    //直接用rawurlencode編碼
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));    //否則的話用iconv函數(shù)把漢字轉(zhuǎn)變成ucs-2編碼,也就是unicode編碼
}

在javascript中就可以用unescape來(lái)解碼了
\u0391-\uFFE5 和\u4e00-\u9fa5來(lái)匹配中文
但好像前者包含漢字下的A-¥等 后者可能是純漢字。
其中解碼函數(shù)為:
復(fù)制代碼 代碼如下:

function unescape($str) {
         $str = rawurldecode($str);
         preg_match_all("/%u.{4}|&#x.{4};|&#\d+;|.+/U",$str,$r);
         $ar = $r[0];
         foreach($ar as $k=>$v) {
                  if(substr($v,0,2) == "%u")
                           $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,-4)));
                  elseif(substr($v,0,3) == "&#x")
                           $ar[$k] = iconv("UCS-2","GBK",pack("H4",substr($v,3,-1)));
                  elseif(substr($v,0,2) == "&#") {
                           $ar[$k] = iconv("UCS-2","GBK",pack("n",substr($v,2,-1)));
                  }
         }
         return join("",$ar);
}

一、編碼范圍
1. GBK (GB2312/GB18030)
\x00-\xff   GBK雙字節(jié)編碼范圍
\x20-\x7f   ASCII
\xa1-\xff   中文
\x80-\xff   中文
2. UTF-8 (Unicode)
\u4e00-\u9fa5 (中文)
\x3130-\x318F (韓文
\xAC00-\xD7A3 (韓文)
\u0800-\u4e00 (日文)
ps: 韓文是大于[\u9fa5]的字符
正則例子:
preg_replace("/([\x80-\xff])/","",$str);
preg_replace("/([u4e00-u9fa5])/","",$str);

相關(guān)文章

  • PHP 采集獲取指定網(wǎng)址的內(nèi)容

    PHP 采集獲取指定網(wǎng)址的內(nèi)容

    用php來(lái)獲取指定網(wǎng)頁(yè)內(nèi)容的實(shí)現(xiàn)代碼,一般采集程序經(jīng)常用的一些代碼,這里只是一個(gè)簡(jiǎn)單的基礎(chǔ)。更詳細(xì)的資料可以參考php 采集成品,可以使用的源碼,這樣才能學(xué)會(huì)更多的東西。
    2010-01-01
  • php靜態(tài)編譯swoole-cli并調(diào)用rust的動(dòng)態(tài)鏈接庫(kù)

    php靜態(tài)編譯swoole-cli并調(diào)用rust的動(dòng)態(tài)鏈接庫(kù)

    這篇文章主要為大家介紹了靜態(tài)編譯swoole-cli并調(diào)用rust的動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-07-07
  • php escape URL編碼

    php escape URL編碼

    php提供的URL編碼函數(shù)是基于字節(jié)的,對(duì)由ie的javascript函數(shù)escape編碼的數(shù)據(jù)就無(wú)能為力了。
    2008-12-12
  • 判斷php數(shù)組是否為索引數(shù)組的實(shí)現(xiàn)方法

    判斷php數(shù)組是否為索引數(shù)組的實(shí)現(xiàn)方法

    本篇文章是對(duì)判斷php數(shù)組是否為索引數(shù)組的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • 從康盛產(chǎn)品(discuz)提取出來(lái)的模板類

    從康盛產(chǎn)品(discuz)提取出來(lái)的模板類

    從康盛產(chǎn)品(discuz)提取出來(lái)的模板類,學(xué)習(xí)php的朋友可以參考下。
    2011-06-06
  • php實(shí)現(xiàn)的返回?cái)?shù)據(jù)格式化類實(shí)例

    php實(shí)現(xiàn)的返回?cái)?shù)據(jù)格式化類實(shí)例

    這篇文章主要介紹了php實(shí)現(xiàn)的返回?cái)?shù)據(jù)格式化類及其應(yīng)用實(shí)例,包括針對(duì)XML、JSON等的格式化,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2014-09-09
  • php定時(shí)刪除文件夾下文件(清理緩存文件)

    php定時(shí)刪除文件夾下文件(清理緩存文件)

    有的時(shí)候網(wǎng)站緩存文件夾里生成的臨時(shí)文件越來(lái)越多,而長(zhǎng)時(shí)間不清理就會(huì)造成文件夾下有上萬(wàn)個(gè)緩存文件,可能會(huì)使ftp工具多無(wú)法進(jìn)入其文件夾。使臨時(shí)文件無(wú)法刪除
    2013-01-01
  • PHP內(nèi)置加密函數(shù)詳解

    PHP內(nèi)置加密函數(shù)詳解

    在網(wǎng)站的開(kāi)發(fā)過(guò)程中,常常需要對(duì)部分?jǐn)?shù)據(jù)(如用戶密碼)進(jìn)行加密,本文主要介紹PHP的幾個(gè)常見(jiàn)的加密函數(shù)
    2016-11-11
  • php和mysql中uft-8中文編碼亂碼的幾種解決辦法

    php和mysql中uft-8中文編碼亂碼的幾種解決辦法

    對(duì)于亂碼這個(gè)問(wèn)題php開(kāi)發(fā)者幾乎都會(huì)有碰到過(guò),我們下面主要是介紹了php文件亂碼和頁(yè)面亂碼以及php mysql數(shù)據(jù)庫(kù)連接時(shí)亂碼解決方法
    2012-04-04
  • php 魔術(shù)方法詳解

    php 魔術(shù)方法詳解

    本文給大家介紹了php面向?qū)ο螽?dāng)中的幾個(gè)魔術(shù)方法,并對(duì)此進(jìn)行一一詳細(xì)介紹,希望對(duì)新手有所幫助。
    2014-11-11

最新評(píng)論