在做Web開(kāi)發(fā)時(shí),我們經(jīng)常需要從URL中獲取參數(shù)來(lái)進(jìn)行不同的操作。$_GET就是PHP中用來(lái)處理GET請(qǐng)求的服務(wù)器變量,它可以將URL中的參數(shù)解析出來(lái)并存儲(chǔ)在一個(gè)關(guān)聯(lián)數(shù)組中。然而,在處理中文參數(shù)時(shí),我們可能會(huì)遇到一些問(wèn)題。
假設(shè)我們有一個(gè)URL:http://example.com/index.php?name=張三&age=18,如果我們使用$_GET來(lái)獲取參數(shù),代碼可以是這樣的:
$name = $_GET['name']; $age = $_GET['age']; echo "你好,$name,你的年齡是 $age 歲。";
但是,如果我們?cè)赨RL中使用中文參數(shù),例如:http://example.com/index.php?name=我不愛(ài)學(xué)習(xí)&age=18,那么$age的值可以正常獲取,但$name的值卻只會(huì)返回“我不愛(ài)學(xué)”。
這是因?yàn)椋琔RL中的中文字符在傳輸過(guò)程中需要進(jìn)行編碼,否則服務(wù)器無(wú)法正確識(shí)別。常用的編碼方式有兩種:UTF-8(萬(wàn)國(guó)碼)和GBK(中文碼)。例如,將上面的URL進(jìn)行編碼后,就會(huì)變成這樣:http://example.com/index.php?name=%E6%88%91%E4%B8%8D%E7%88%B1%E5%AD%A6%E4%B9%A0&age=18。
因此,在程序中我們需要使用URL解碼函數(shù)(urldecode)來(lái)將編碼后的字符串解碼為原始字符串。上面的代碼可以改為:
$name = urldecode($_GET['name']); $age = $_GET['age']; echo "你好,$name,你的年齡是 $age 歲。";
不過(guò),需要注意的是,在某些情況下,URL解碼后的字符串依然無(wú)法正常顯示,例如當(dāng)URL中的中文字符被舊版IE瀏覽器自動(dòng)進(jìn)行GBK編碼時(shí)。這時(shí),我們需要手動(dòng)將字符串轉(zhuǎn)換為UTF-8編碼。
代碼示例:
function gbktoutf8($str) { $enc = mb_detect_encoding($str, array('UTF-8', 'GBK')); if ($enc == 'UTF-8') { return $str; } else { return iconv('GBK', 'UTF-8//IGNORE', $str); } } $name = gbktoutf8($_GET['name']); $age = $_GET['age']; echo "你好,$name,你的年齡是 $age 歲。";
以上代碼可以先檢測(cè)字符串的編碼,如果是UTF-8,則直接返回原字符串,否則將其轉(zhuǎn)換為UTF-8編碼。
總結(jié)來(lái)說(shuō),處理中文字符時(shí),我們需要注意編碼問(wèn)題,并且在程序中正確使用URL解碼函數(shù)。同時(shí),為了兼容不同瀏覽器的編碼方式,我們可以手動(dòng)將字符串轉(zhuǎn)換為UTF-8編碼。