2024 年 PHP 日本研討會

urldecode

(PHP 4, PHP 5, PHP 7, PHP 8)

urldecode解碼 URL 編碼的字串

說明

urldecode(字串 $string): 字串

解碼給定字串中的任何 %## 編碼。加號 ('+') 會解碼成空格字元。

參數

字串

要解碼的字串。

回傳值

返回已解碼的字串。

範例

範例 #1 urldecode() 範例

<?php
$query
= "my=apples&are=green+and+red";

foreach (
explode('&', $query) as $chunk) {
$param = explode("=", $chunk);

if (
$param) {
printf("參數 \"%s\" 的值是 \"%s\"<br/>\n", urldecode($param[0]), urldecode($param[1]));
}
}
?>

注意事項

警告

超全域變數 $_GET$_REQUEST 已經解碼。在 $_GET$_REQUEST 的元素上使用 urldecode() 可能會產生非預期且危險的結果。

另請參閱

新增註釋

使用者貢獻的註釋 5 則註釋

alejandro at devenet dot net
13 年前
當客戶端發送 Get 資料時,utf-8 字元編碼在 urlencode 中有一個小問題。
考慮 "º" 字元。
有些客戶端可以發送(例如)
foo.php?myvar=%BA
而其他客戶端發送
foo.php?myvar=%C2%BA(「正確的」URL 編碼)

在這種情況下,您將值賦給變數 $x

<?php
$x
= $_GET['myvar'];
?>

$x 儲存:在第一種情況下是 "�"(錯誤),在第二種情況下是 "º"(正確)

要解決這個問題,您可以使用這個函式

<?php
函式 to_utf8( $string ) {
// 來自 http://w3.org/International/questions/qa-forms-utf-8.html
如果 ( preg_match('%^(?:
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # 非過長 2 位元組
| \xE0[\xA0-\xBF][\x80-\xBF] # 排除過長
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # 直接 3 位元組
| \xED[\x80-\x9F][\x80-\xBF] # 排除代理對
| \xF0[\x90-\xBF][\x80-\xBF]{2} # 平面 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # 平面 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # 平面 16
)*$%xs'
, $string) ) {
返回
$string;
} 否則 {
返回
iconv( 'CP1252', 'UTF-8', $string);
}
}
?>

並以這種方式賦值

<?php
$x
= to_utf8( $_GET['myvar'] );
?>

$x 儲存:第一種情況 "º" (良好) 和第二種情況 "º" (良好)

解決了很多 i18n 問題。

請在下一版的 PHP 中修正 $_GET 變數的自動 URL 解碼。

再見。

Alejandro Salamanca
Visual
18 年前
如果您在 JavaScript 中跳脫字串,並想在 PHP 中使用 urldecode 解碼它們(或者希望 PHP 在您將它們放入查詢字串或 POST 請求時自動解碼它們),您應該使用 JavaScript 函式 encodeURIComponent() 而不是 escape()。這樣您就不需要先前評論中提到的任何花俏的客製化 utf_urldecode 函式。
tomas at penajaca dot com dot br
21 年前
urldecode 不會解碼 "%0",而是繞過它。當您使用固定長度字串時,可能會造成問題。

您可以使用以下函式。

函式 my_urldecode($string){

$array = split ("%",$string);

如果 (is_array($array)){
當 (list ($k,$v) = each ($array)){
$ascii = base_convert ($v,16,10);
$ret .= chr ($ascii);
}
}
返回 ("$ret");
}
Joe
16 年前
值得一提的是,如果您正在使用 AJAX 並且需要編碼要發送到 PHP 應用程式的字串,您可能不需要在 PHP 中解碼它們。

<?php
echo stripslashes(nl2br($_POST['message']));
?>

如果訊息已編碼,將會正確輸出使用 JavaScript 程式碼發送的訊息

message = encodeURIComponent(message)

並且使用標頭透過 AJAX POST 請求發送
ajaxVar.setRequestHeader('Content-type', 'application/x-www-form-urlencoded')
bloodjazman at gmail dot com
4 年前
根據 HTML x-www-form-url-encoded 媒體類型,"+" 將被空格取代
參見 http://www.faqs.org/rfcs/rfc1866.html
To Top