天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

解析php中的escape函數

采用js對URL中的漢字進行escape編碼。
<a href="" onclick="window.open('product_list.php?p_sort='+escape('腳本之家'));">這樣點擊鏈接后的效時:
引用:http://127.0.0.1/shop/product_list.php?p_sort=php%u5F00%u53D1%u8D44%u6E90%u7F51
生成了這樣的效果, 很明顯用php的urldecode()或者base64_decode()是無法反解的。
解決方法, 用php寫一個反解函數:
復制代碼 代碼如下:
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編碼會自動轉換成為UTF-8, 所以必須進行編碼轉換才能得到正確的結果,否則會中文亂碼。但如果使用UTF-8編碼就不用這一步了。
代碼如下:print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
到此我們就成功地反解了js的escape編碼了。
如下:
另外我找到個用php實現js的escape編碼的函數:
復制代碼 代碼如下:
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下可能要打開此項                          
$retrunString.="%u".$tmpString;                          
$i++;                 
} else
{                          
$retrunString.="%".dechex(ord($str[$i]));                 
}        
}        
return $retrunString;
}

在json中不支持中文,用它傳送中文數據就會出現數據丟失或者亂碼,必須在傳 送前對要發送的字符串進行編碼,由于傳送過去需要用js進行數據解析,考慮到js中有unescape函數,故若在php中有個escape函數,對數據 進行編碼,在客戶端用unescape進行 解碼,這樣就會方便很多。
先在網上搜索一把,很多用php實現的escape函數,大同小異,比如下面一個:
復制代碼 代碼如下:
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);
}

這個函數可以很好的工作,但是,也許有新手不理解這個函數的原理(比如我),用起來總是不放心,現在我就來解釋一下這個函數的原理。而且我認為,拿別人的代碼來復用,好比站在了巨人的肩膀上,但是若不理解別人的代碼,遲早要掉到地面上。
第一句:preg_match_all("/[/x80-/xff].|[/x01-/x7f]+/",$str,$r);這個是用正則表達式匹配 字符串中所有的字符,[/x80-/xff]. 匹配的是漢字,/x表示匹配字符的16進制編碼,[ ] 是類選擇符,“.” 表示任意一個字符,這樣[/x80-/xff].匹配的是兩個字符,其中第一個就是16進制從80到ff的字符,而這恰好就是漢字編碼的第一個字符。這樣 就能完整的匹配一個漢字。關于unicode中漢字的編碼,大家可以到網上搜索一下。同理,[/x01-/x7f]+英文字符串,因為最早的英文是 ASCII編碼,編碼值小于128,也就是16進制的從01到7f,"+"表示一個或者多個字符,這樣[/x01-/x7f]+就能匹配連續多個英文字符 串。
復制代碼 代碼如下:
$ar = $r[0];             //$r[0]里存放是匹配到的數組
foreach($ar as $k=>$v) {
    if(ord($v[0]) < 128)                 //假如字符編碼值小于128,說明是個英文字符
      $ar[$k] = rawurlencode($v);    //直接用rawurlencode編碼
    else
      $ar[$k] = "%u".bin2hex(iconv("GB2312","UCS-2",$v));    //否則的話用iconv函數把漢字轉變成ucs-2編碼,也就是unicode編碼
}

Javascript中就可以用unescape來解碼了
/u0391-/uFFE5 和/u4e00-/u9fa5來匹配中文
但好像前者包含漢字下的A-¥等 后者可能是純漢字。
其中解碼函數為:
復制代碼 代碼如下:
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雙字節編碼范圍
/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);

php技術解析php中的escape函數,轉載需保留來源!

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

主站蜘蛛池模板: 午夜国产精品免费观看 | 色偷偷av男人的天堂 | 俄罗斯XX性幻女18 | 久久精品国产首叶 | 久久久精品国产免费A片胖妇女 | 亚洲欧美成人无码久久久 | 强奷漂亮女老板在线播放 | 久久亚洲国产中文字幕 | 91精品一区二区综合在线 | 一个人视频日本在线观看 | 东北小伙FREECHINESE野外 东北嫖妓对白粗口 | 熟女理发厅 | 99精品福利视频 | 在线A亚洲老鸭窝天堂AV高清 | 久久草这里全是精品香蕉频线观 | 天天躁日日躁狠狠躁午夜剧场 | 欧美精品一区二区三区视频 | 亚洲日韩中文字幕日本有码 | 亚洲欲色欲色XXXXX在线AV | swag合集120部| 久久精品国产亚洲AV麻豆欧美玲 | 门鱼电影完整版免费版 | 99亚洲精品自拍AV成人软件 | 51精品少妇人妻AV一区二区 | 国产精品麻豆a啊在线观看 国产精品麻豆AV | 2012中文字幕手机在线 | 国产精品九九九久久九九 | 欧美另类videosbest | 四房播播最新地址 | 伊人久久精品AV无码一区 | 夫妻主vk | 夜夜女人国产香蕉久久精品 | 中文在线观看免费网站 | 为什么丈夫插我我却喜欢被打着插 | 97夜夜澡人人爽人人模人人喊 | 91黄色大片| 国内精品日本久久久久影院 | 美女拉开腿让男生桶到爽 | 精品四虎国产在免费观看 | 无码任你躁久久久久久久 | 99久久免费精品国产免费 |