2024 年 PHP Conference Japan

urlencode

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

urlencodeURL 編碼字串

說明

urlencode(字串 $string): 字串

此函式在編碼要於 URL 查詢部分使用的字串時很方便,可以輕鬆地將變數傳遞到下一頁。

參數

字串

要編碼的字串。

傳回值

此函式會傳回一個字串,其中所有非字母數字字元(除了 -_. 之外)都會被取代為一個百分比符號 (%),後接兩個十六進位數字,而空格則編碼為加號 (+)。它的編碼方式與 WWW 表單提交的資料相同,也就是與 application/x-www-form-urlencoded 媒體類型相同。 由於歷史原因,空格會被編碼為加號 (+) ,這點與 » RFC 3986 編碼(參見 rawurlencode())不同。

範例

範例 #1 urlencode() 範例

<?php
$userinput
= 'Data123!@-_ +';
echo
"UserInput: $userinput\n";
echo
'<a href="mycgi?foo=', urlencode($userinput), '">';
?>

上述範例將輸出:

UserInput: Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B">

範例 #2 urlencode()htmlentities() 範例

<?php
$foo
= 'Data123!@-_ +';
$bar = "Not the same content as $foo";
echo
"foo: $foo\n";
echo
"bar: $bar\n";
$query_string = 'foo=' . urlencode($foo) . '&bar=' . urlencode($bar);
echo
'<a href="mycgi?' . htmlentities($query_string) . '">';
?>

上述範例將輸出:

foo: Data123!@-_ +
bar: Not the same content as Data123!@-_ +
<a href="mycgi?foo=Data123%21%40-_+%2B&amp;bar=Not+the+same+content+as+Data123%21%40-_+%2B">

注意事項

注意:

請小心處理可能與 HTML 實體相符的變數。 像 &amp、&copy 和 &pound 等字元會被瀏覽器解析,並使用實際的實體字元,而不是所需的變數名稱。 這是 W3C 多年來一直提醒開發者要注意的一個明顯問題。相關參考資料請見:» http://www.w3.org/TR/html4/appendix/notes.html#h-B.2.2

PHP 支援透過 arg_separator .ini 指令將參數分隔符號更改為 W3C 建議的分號。但遺憾的是,大多數使用者代理程式不會以這種分號分隔的格式發送表單資料。一種更具移植性的解決方法是使用 &amp; 作為分隔符號,而不是 &。您不需要为此更改 PHP 的 arg_separator,保持它為 & 即可,但只需使用 htmlentities()htmlspecialchars() 對 URL 進行編碼。

另請參閱

新增註解

使用者貢獻的註解 6 則註解

davis dot peixoto at gmail dot com
14 年前
urlencode 函式和 rawurlencode 主要基於 RFC 1738。

然而,自 2005 年以來,目前用於 URI 標準的 RFC 是 RFC 3986。

以下是一個根據 RFC 3986 編碼 URL 的函式。

<?php
函數 myUrlEncode($string) {
$entities = 陣列('%21', '%2A', '%27', '%28', '%29', '%3B', '%3A', '%40', '%26', '%3D', '%2B', '%24', '%2C', '%2F', '%3F', '%25', '%23', '%5B', '%5D');
$replacements = 陣列('!', '*', "'", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
返回
str_replace($entities, $replacements, urlencode($string));
}
?>
temu92 at gmail dot com
15 年前
我需要對 UTF8 網址進行編碼和解碼,我想出了這些非常簡單的函數。希望這個有幫助!

<?php
函數 url_encode($string){
返回
urlencode(utf8_encode($string));
}

函數
url_decode($string){
返回
utf8_decode(urldecode($string));
}
?>
materialsmoke at gmail dot com
1 年前
此函數將對 URL 進行編碼,同時保留 URL 的功能,以便您可以在瀏覽器中複製和貼上它
```
函數 urlEncode($url) {
$parsedUrl = parse_url($url);

$encodedScheme = urlencode($parsedUrl['scheme']);
$encodedHost = urlencode($parsedUrl['host']);

$encodedPath = implode('/', array_map('urlencode', explode('/', $parsedUrl['path'])));
如果 (isset($parsedUrl['query'])) {
$encodedQuery = '?' . urlencode($parsedUrl['query']);
} 否則 {
$encodedQuery = '';
}

返回 "{$encodedScheme}://{$encodedHost}{$encodedPath}{$encodedQuery}";
}
```
daniel+php at danielnorton dot com
15 年前
如果文字包含電子郵件地址,請勿使用 urlencode() 或 urldecode(),因為它會破壞 "+" 字元,而 "+" 是完全有效的電子郵件地址字元。

除非您確定不會編碼電子郵件地址,並且需要非標準 "+" 用法提供的可讀性,否則請始終使用 rawurlencode() 或 rawurldecode()。
omid at omidsakhi dot com
14 年前
我需要一個 PHP 函式來執行與 Javascript 中的完整 escape 函式相同的工作。我花了一些時間卻找不到。但最終我決定自己寫程式碼。所以只是為了節省時間

<?php
function fullescape($in)
{
$out = '';
for (
$i=0;$i<strlen($in);$i++)
{
$hex = dechex(ord($in[$i]));
if (
$hex=='')
$out = $out.urlencode($in[$i]);
else
$out = $out .'%'.(strlen($hex)==1 ? '0'.strtoupper($hex) : strtoupper($hex));
}
$out = str_replace('+','%20',$out);
$out = str_replace('_','%5F',$out);
$out = str_replace('.','%2E',$out);
$out = str_replace('-','%2D',$out);
return
$out;
}
?>

可以使用 Javascript 中的 unscape 函式完全解碼。
ahrensberg at gmail dot com
17 年前
就像之前的「Benjamin dot Bruno at web dot de」所寫,使用特殊字元編碼字串到 Flash 時可能會遇到問題。Benjamin 寫道

<?php
函式 flash_encode ($input)
{
返回
rawurlencode(utf8_encode($input));
}
?>

……可以解決這個問題。可惜的是,Flash 讀取某些引號時仍然會有問題,但用這個

<?php
函式 flash_encode($string)
{
$string = rawurlencode(utf8_encode($string));

$string = str_replace("%C2%96", "-", $string);
$string = str_replace("%C2%91", "%27", $string);
$string = str_replace("%C2%92", "%27", $string);
$string = str_replace("%C2%82", "%27", $string);
$string = str_replace("%C2%93", "%22", $string);
$string = str_replace("%C2%94", "%22", $string);
$string = str_replace("%C2%84", "%22", $string);
$string = str_replace("%C2%8B", "%C2%AB", $string);
$string = str_replace("%C2%9B", "%C2%BB", $string);

返回
$string;
}
?>

……應該可以解決這個問題。
To Top