使用 PHP Curl 抓取含中文參數的 URL 時,正確的編碼處理至關重要。PHP 提供 urlencode() 與 rawurlencode() 兩個函數,兩者差異在於空格編碼:前者編為 +,後者編為 %20。關鍵在於僅對需編碼的部分(如查詢參數值)編碼,避免破壞 URL 結構(如冒號、斜線被轉義)。
$str = '博 客';
echo urlencode($str); // 輸出:%B2%A9+%BF%CD
echo rawurlencode($str); // 輸出:%B2%A9%20%BF%CD
$url = 'https://www.baidu.com/s?wd=博 客';
$arr = explode('=', $url);
$url = $arr[0] . '=' . rawurlencode($arr[1]);
// 結果:https://www.baidu.com/s?wd=%E5%8D%9A%20%E5%AE%A2
function cn_urlencode($url) {
$pregstr = "/[\x{4e00}-\x{9fa5}]+/u"; // UTF-8 中文正則
if (preg_match_all($pregstr, $url, $matchArray)) {
foreach ($matchArray[0] as $val) {
$url = str_replace($val, urlencode($val), $url);
}
if (strpos($url, ' ')) {
$url = str_replace(' ', '%20', $url);
}
}
return $url;
}
// 使用
$url = 'https://www.baidu.com/s?wd=博 客';
echo cn_urlencode($url);
// 結果:https://www.baidu.com/s?wd=%E5%8D%9A%20%E5%AE%A2
rawurlencode():符合 RFC 3986 標準,空格編為 %20,相容性更佳。= 之後)編碼,勿對整個 URL 執行。rawurldecode() 解碼再重新編碼,避免雙重編碼。