淺談php中urlencode與rawurlencode的區(qū)別
前段時(shí)間說(shuō)自己遇到了個(gè)《URL加號(hào)引發(fā)錯(cuò)誤》的BUG,引起這個(gè)bug的原因就是自己在URL中使用了 urlencode 函數(shù),該函數(shù)會(huì)把空格轉(zhuǎn)換成加號(hào),這樣就導(dǎo)致URL解析出錯(cuò),而空格只有轉(zhuǎn)換成 %20 才可以可以正常解析,這時(shí)我們就需要使用 rawurlencode 函數(shù)。
下面就介紹一下 urlencode 函數(shù)與 rawurlencode 函數(shù)的區(qū)別:
urlencode 函數(shù):
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù),空格則編碼為加號(hào)(+)。此編碼與 WWW 表單 POST 數(shù)據(jù)的編碼方式是一樣的,同時(shí)與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由于歷史原因,此編碼在將空格編碼為加號(hào)(+)方面與 RFC1738 編碼(參見 rawurlencode())不同。
rawurlencode 函數(shù):
返回字符串,此字符串中除了 -_. 之外的所有非字母數(shù)字字符都將被替換成百分號(hào)(%)后跟兩位十六進(jìn)制數(shù)。這是在 » RFC 3986 中描述的編碼,是為了保護(hù)原義字符以免其被解釋為特殊的 URL 定界符,同時(shí)保護(hù) URL 格式以免其被傳輸媒體(像一些郵件系統(tǒng))使用字符轉(zhuǎn)換時(shí)弄亂。下面我們來(lái)看一下例子:
<?php $string = "hello world"; echo urlencode($string) . '<br/>'; //輸出:hello+world echo rawurldecode($string) . '<br/>';//輸出:hello%20world ?>
具體例子比較:
<?php for ($i = 0x20; $i < 0x7f; $i++) { $str .= dechex($i); } $asscii = pack("H*",$str); echo "所有的可打印的asscii字符:(從空格到~)n". $asscii."\n"; echo "urlencode 的結(jié)果:\n".urlencode($asscii); echo "\n"; echo "urlencode 不做編碼的字http://chabaoo.cn/符:\n".preg_replace("/%.{2}/","",urlencode($asscii)); echo "\n"; echo "rawurlencode 的結(jié)果:\n".rawurlencode($asscii); echo "\n"; echo "rawurlencode 不做編碼的字符:\n".preg_replace("/%.{2}/","",rawurlencode($asscii)); echo "\n"; exit; ?> 輸出結(jié)果: ——————————————————————————— 所有的可打印的asscii字符:(從空格到~) !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~ urlencode 的結(jié)果: +%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E urlencode 不做編碼的字符: +-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz rawurlencode 的結(jié)果: %20%21%22%23%24%25%26%27%28%29%2A%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5C%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E rawurlencode 不做編碼的字符: -.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz
比較二者的結(jié)果:
1. 數(shù)字、大小寫字母都不編碼
2. 減號(hào)、點(diǎn)號(hào)、下劃線 三個(gè)不編碼
3. rawurlencode比urlencode多編碼一個(gè)”加號(hào)“
關(guān)于JavaScript中escape與encodeURIComponent的區(qū)別:
>>> console.log(encodeURIComponent("統(tǒng)一注冊(cè)1")); %E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1 >>> console.log(escape("統(tǒng)一注冊(cè)1")); %u7EDF%u4E00%u6CE8%u518C1 <?php echo iconv("utf-8","gbk",urldecode("%E7%BB%9F%E4%B8%80%E6%B3%A8%E5%86%8C1")); echo "\n"; echo urldecode("%u7EDF%u4E00%u6CE8%u518C1"); // 使用下面的unescape可以 //echo iconv("utf-8","gbk",unescape("%u7EDF%u4E00%u6CE8%u518C1"); exit; ?> 輸出結(jié)果: ====================================== 統(tǒng)一注冊(cè)1 %u7EDF%u4E00%u6CE8%u518C1 ======================================
結(jié)果說(shuō)明:
1. encodeURIComponent 總是把輸入轉(zhuǎn)換成utf8編碼處理的,按字節(jié)編碼
2. escape是按照unicode編碼處理的,因?yàn)樗矊?duì)url中不安全的字符做了編碼,所以也可以在url中做編碼使用,但是,服務(wù)器端不會(huì)自動(dòng)解碼,下面提供一個(gè)PHP版的解碼函數(shù),是用手冊(cè)里找的:
<?php 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","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) == "&#") { $ar[$k] = iconv("UCS-2","UTF-8",pack("n",substr($v,2,-1))); } } return join("",$ar); } ?> >>> console.log(escape(" !\"#$%&'()*+,-./0123456789:;=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~")); %20%21%22%23%24%25%26%27%28%29*+%2C-./0123456789%3A%3B%3C%3D%3E%3F@ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D%7E >>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~")); %20!%22%23%24%25%26'()*%2B%2C-.%2F0123456789%3A%3B%3C%3D%3E%3F%40ABCDEFGHIJKLMNOPQRSTUVWXYZ%5B%5D%5E_%60abcdefghijklmnopqrstuvwxyz%7B%7C%7D~ >>> console.log(escape("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,"")); *+-./0123456789@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz >>> console.log(encodeURIComponent("!\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~").replace(/%.{2}/g,"")); !'()*-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~
結(jié)果比較:
escape未編碼的字符: *+-./@_ 共7個(gè)
encodeURIComponent未編碼的字符: !'()*-._~ 共9個(gè)
以上這篇淺談php中urlencode與rawurlencode的區(qū)別就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
php高清晰度無(wú)損圖片壓縮功能的實(shí)現(xiàn)代碼
經(jīng)常會(huì)用到把上傳的大圖片壓縮,特別是體積,在微信等APP應(yīng)用上,也默認(rèn)都是有壓縮的,那么,怎么樣對(duì)圖片大幅度壓縮卻仍能保持較高的清晰度呢?接下來(lái)通過本文給大家分享php高清晰度無(wú)損圖片壓縮功能,感興趣的朋友一起看看吧2018-12-12IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安裝配置圖文教程 2009年
IIS6+PHP5+MySQL5+Zend Optimizer+phpMyAdmin安裝配置教程 2009年最新版2009-06-06php根據(jù)isbn書號(hào)查詢amazon網(wǎng)站上的圖書信息的示例
這篇文章主要介紹了php根據(jù)isbn書號(hào)查詢amazon網(wǎng)站上的圖書信息的示例,需要的朋友可以參考下2014-02-02