亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 7155 | 回復(fù): 11
打印 上一主題 下一主題

用js進行url編碼后用php反解以及用php實現(xiàn)js的escape功能函數(shù)總結(jié) [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2007-11-15 17:36 |只看該作者 |倒序瀏覽
這次第一次用smarttemplate這個模板,比smarty小巧了很多,但也有些不方便的地方。

smarty可以直接對url進行編碼, 比如<!--{$var|urlencode}-->

但在smarttemplate里面就好像沒有,由于鏈接是由js提交的,而不是表單提交,所以不能自動編碼。

解決辦法: 采用js對URL中的漢字進行escape編碼。

  1. <a href="" onclick="window.open('product_list.php?p_sort='+escape('PHP開發(fā)資源網(wǎng)'));">
復(fù)制代碼


這樣點擊鏈接后的效時:

http://127.0.0.1/shop/product_list.php?p_sort=PHP%u5F00%u53D1%u8D44%u6E90%u7F51


生成了這樣的效果, 很明顯用PHP的urldecode()或者base64_decode()是無法反解的。

解決方法, 用PHP寫一個反解函數(shù):

  1. function js_unescape($str)
  2. {
  3.         $ret = '';
  4.         $len = strlen($str);

  5.         for ($i = 0; $i < $len; $i++)
  6.         {
  7.                 if ($str[$i] == '%' && $str[$i+1] == 'u')
  8.                 {
  9.                         $val = hexdec(substr($str, $i+2, 4));

  10.                         if ($val < 0x7f) $ret .= chr($val);
  11.                         else if($val < 0x800) $ret .= chr(0xc0|($val>>6)).chr(0x80|($val&0x3f));
  12.                         else $ret .= chr(0xe0|($val>>12)).chr(0x80|(($val>>6)&0x3f)).chr(0x80|($val&0x3f));

  13.                         $i += 5;
  14.                 }
  15.                 else if ($str[$i] == '%')
  16.                 {
  17.                         $ret .= urldecode(substr($str, $i, 3));
  18.                         $i += 2;
  19.                 }
  20.                 else $ret .= $str[$i];
  21.         }
  22.         return $ret;
  23. }
復(fù)制代碼



注意JS編碼會自動轉(zhuǎn)換成為UTF-8, 所以必須進行編碼轉(zhuǎn)換才能得到正確的結(jié)果,否則會中文亂碼。

代碼如下:

  1. print iconv('utf-8', 'gb2312', js_unescape($_REQUEST['p_sort']));
復(fù)制代碼


到此我們就成功地反解了js的escape編碼了。
如下:
PHP開發(fā)資源網(wǎng)


另外我找到個用PHP實現(xiàn)js的escape編碼的函數(shù):

  1. function phpescape($str)
  2. {
  3.          $sublen=strlen($str);
  4.          $retrunString="";
  5.          for ($i=0;$i<$sublen;$i++)
  6.          {
  7.                   if(ord($str[$i])>=127)
  8.                   {
  9.                            $tmpString=bin2hex(iconv("gb2312","ucs-2",substr($str,$i,2)));
  10.                            //$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);window下可能要打開此項
  11.                            $retrunString.="%u".$tmpString;
  12.                            $i++;
  13.                   } else {
  14.                            $retrunString.="%".dechex(ord($str[$i]));
  15.                   }
  16.          }
  17.          return $retrunString;
  18. }
復(fù)制代碼


大家是否遇到過這種問題呢?

論壇徽章:
0
2 [報告]
發(fā)表于 2007-11-15 17:37 |只看該作者
很久沒冒泡了。。。。

論壇徽章:
0
3 [報告]
發(fā)表于 2007-11-16 08:35 |只看該作者
看完,....學(xué)習(xí)...  頂一個

論壇徽章:
0
4 [報告]
發(fā)表于 2007-11-16 09:43 |只看該作者
不知道原理。。。呵呵 學(xué)識尚淺

論壇徽章:
0
5 [報告]
發(fā)表于 2007-11-16 10:45 |只看該作者
我用的都是UTf-8

所以js用escape
PHP接收時,無需什么轉(zhuǎn)換!

論壇徽章:
0
6 [報告]
發(fā)表于 2007-11-16 22:33 |只看該作者
不錯不錯。正遇到類似問題。

論壇徽章:
0
7 [報告]
發(fā)表于 2007-11-18 21:56 |只看該作者
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;
}


$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
這個是什么意思啊 ? 有什么用,為什么說在win下打開此項啊 ?

[ 本帖最后由 koocy 于 2007-11-18 21:57 編輯 ]

論壇徽章:
0
8 [報告]
發(fā)表于 2007-11-18 22:08 |只看該作者
我前兩天試著用smarttemplate+xajax,發(fā)現(xiàn)很好玩
用PHP自動生成js的感覺真好

論壇徽章:
0
9 [報告]
發(fā)表于 2007-11-19 18:13 |只看該作者
原理就是UTF8編碼的字符,轉(zhuǎn)成16進制,前面加%u,能被JS的escape反解
如果是轉(zhuǎn)成10進制,前面加 &# 后面加 ;,這個數(shù)字串可以直接在IE上顯示漢字 ,如 ࡪ

如果要轉(zhuǎn)回來呢,就先轉(zhuǎn)到2進制,然后用 pack() 打包,PHP就可以得到 unescape 的效果了

$tmpString=substr($tmpString,2,2).substr($tmpString,0,2);
這句話的目的是因為高低位對調(diào)的問題,如果你顯示得不對,可以試試去掉注釋

最后,其實這個問題很簡單,用16進制編輯器打開一個有漢字,然后用個計算器算來算起的....

論壇徽章:
0
10 [報告]
發(fā)表于 2007-11-19 22:54 |只看該作者
學(xué)習(xí)樓主和樓上的..
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP