PHP的urlencode函數(shù)是用于將URL中的非法字符編碼為合法字符,從而避免URL無法正常請求的問題。但是,有時(shí)候我們需要在URL中傳遞中文等字符,而urlencode函數(shù)又會(huì)將其編碼為一堆%XX形式的字符,這時(shí)候就需要用到PHP的encodeuri函數(shù)。
encodeuri函數(shù)是JavaScript自帶的一個(gè)編碼URL的函數(shù),在PHP中也被廣泛應(yīng)用。它可以將URL中的非法字符轉(zhuǎn)義為UTF-8字符,從而避免瀏覽器出現(xiàn)不兼容的情況。下面我們通過舉例來演示這個(gè)函數(shù)的使用。
$url = 'http://www.example.com?name='.urlencode('張三'); echo $url; //輸出:http://www.example.com?name=%E5%BC%A0%E4%B8%89 $url = 'http://www.example.com?name='.rawurlencode('張三'); echo $url; //輸出:http://www.example.com?name=%C5%B5%CB%F5 $url = 'http://www.example.com?name='.urlencode('張三'); $url = str_replace('%', '\\x', $url); eval("\$url = \"$url\";"); echo $url; //輸出:http://www.example.com?name=\xE5\xBC\xA0\xE4\xB8\x89
從上面的代碼可以看到,urlencode函數(shù)會(huì)將中文轉(zhuǎn)換為%E5%BC%A0%E4%B8%89這樣的字符,而rawurlencode函數(shù)會(huì)將中文轉(zhuǎn)換為%C5%B5%CB%F5這樣的字符。這兩個(gè)函數(shù)在URL中使用的頻率非常高,但是在某些情況下并不完美。
比如,有時(shí)候我們需要將URL中的字符轉(zhuǎn)換為16進(jìn)制形式,而urlencode和rawurlencode無法做到這一點(diǎn)。但是,encodeuri函數(shù)可以通過把%轉(zhuǎn)換為\x的形式來實(shí)現(xiàn)這個(gè)功能。
具體而言,在將URL傳給eval函數(shù)前,我們需要先將%字符轉(zhuǎn)換為\x字符,然后再傳給eval函數(shù)進(jìn)行轉(zhuǎn)換。由于eval函數(shù)對轉(zhuǎn)義字符的處理比較完美,因此可以完成這個(gè)任務(wù)。
當(dāng)然,這種轉(zhuǎn)義方式比較麻煩,而且容易導(dǎo)致安全問題。因此,大多數(shù)情況下還是建議使用urlencode和rawurlencode函數(shù)。
綜上所述,encodeuri函數(shù)雖然看起來很神奇,但是并不是萬能的。在使用URL時(shí),我們應(yīng)根據(jù)實(shí)際情況選擇不同的編碼方式,并且盡可能避免使用eval函數(shù)等可能導(dǎo)致安全問題的函數(shù)。